Dart: Refactors Proxies

This change implements some of the good suggestions from:

https://github.com/domokit/mojo/issues/647

In particular, it does away with the wierd 'ptr' thing, is more
careful to mangle names that could conflict, and hopefully has
an easier-to-follow structure. This comes at the cost of needing
an indirection to access "control" functions on a Proxy, as
suggested by floitsch@ (though I have punched holes for close()
and responseOrError() since they show up a lot).

related #647

R=johnmccutchan@google.com

Review URL: https://codereview.chromium.org/1964193002 .
diff --git a/benchmarks/mojo_rtt_benchmark/lib/main.dart b/benchmarks/mojo_rtt_benchmark/lib/main.dart
index 8c4e85f..6a3e760 100644
--- a/benchmarks/mojo_rtt_benchmark/lib/main.dart
+++ b/benchmarks/mojo_rtt_benchmark/lib/main.dart
@@ -96,7 +96,7 @@
   }
 
   Future _echo(int idx, String s) {
-    return _echoProxies[idx].ptr.echoString(s);
+    return _echoProxies[idx].echoString(s);
   }
 
   _errorHandler(Object e) {
diff --git a/examples/dart/camera_roll/lib/main.dart b/examples/dart/camera_roll/lib/main.dart
index d0ab8a7..53f5a2d 100644
--- a/examples/dart/camera_roll/lib/main.dart
+++ b/examples/dart/camera_roll/lib/main.dart
@@ -54,11 +54,11 @@
 }
 
 void getPhoto() {
-  var future = cameraRoll.ptr.getPhoto(photoIndex);
+  var future = cameraRoll.getPhoto(photoIndex);
   future.then((response) {
     if (response.photo == null) {
       print("Photo $photoIndex not found, returning to the first photo.");
-      cameraRoll.ptr.update();
+      cameraRoll.update();
       photoIndex = 0;
       getPhoto();
       return;
diff --git a/examples/dart/camera_video/lib/main.dart b/examples/dart/camera_video/lib/main.dart
index 30eb7a6..e77e3b5 100644
--- a/examples/dart/camera_video/lib/main.dart
+++ b/examples/dart/camera_video/lib/main.dart
@@ -62,7 +62,7 @@
 }
 
 void drawNextPhoto() {
-  var future = camera.ptr.getLatestFrame();
+  var future = camera.getLatestFrame();
   future.then((response) {
     if (response.content == null) {
       drawNextPhoto();
diff --git a/examples/dart/device_info/lib/main.dart b/examples/dart/device_info/lib/main.dart
index bd9a99a..f58a95b 100644
--- a/examples/dart/device_info/lib/main.dart
+++ b/examples/dart/device_info/lib/main.dart
@@ -17,7 +17,7 @@
 
   Future initialize(List<String> args, String url) async {
     connectToService("mojo:device_info", _deviceInfo);
-    print(await _deviceInfo.ptr.getDeviceType());
+    print(await _deviceInfo.getDeviceType());
     _deviceInfo.close();
     close();
   }
diff --git a/examples/dart/echo_client/lib/main.dart b/examples/dart/echo_client/lib/main.dart
index 3fd4ad1..9315132 100644
--- a/examples/dart/echo_client/lib/main.dart
+++ b/examples/dart/echo_client/lib/main.dart
@@ -24,7 +24,7 @@
     final server = (arguments.length > 0) ? arguments[1] : "dart_echo_server";
     connectToService(url.replaceAll("dart_echo_client", server), _echoProxy);
 
-    _echoProxy.ptr.echoString("hello world").then((response) {
+    _echoProxy.echoString("hello world").then((response) {
       print("${response.value}");
     }).whenComplete(_closeHandles);
   }
diff --git a/examples/dart/hello_world/hello/lib/main.dart b/examples/dart/hello_world/hello/lib/main.dart
index 19c0e0e..0089484 100644
--- a/examples/dart/hello_world/hello/lib/main.dart
+++ b/examples/dart/hello_world/hello/lib/main.dart
@@ -29,7 +29,7 @@
     // app has a chance to come up. Instead, we wait to close this app until
     // the "world" app comes up, does its print, and closes its end of the
     // connection.
-    c.remoteServiceProvider.impl.onError = closeApplication;
+    c.remoteServiceProvider.ctrl.onError = closeApplication;
   }
 
   Future closeApplication(e) async {
diff --git a/examples/dart/netcat/lib/main.dart b/examples/dart/netcat/lib/main.dart
index e12e3c5..9ae2845 100644
--- a/examples/dart/netcat/lib/main.dart
+++ b/examples/dart/netcat/lib/main.dart
@@ -65,7 +65,7 @@
 
       NetAddress local_address = makeIPv4NetAddress([0, 0, 0, 0], 0);
       var boundSocket = new TcpBoundSocketProxy.unbound();
-      await networkService.ptr.createTcpBoundSocket(local_address, boundSocket);
+      await networkService.createTcpBoundSocket(local_address, boundSocket);
       await networkService.close();
 
       var sendDataPipe = new MojoDataPipe();
@@ -73,7 +73,7 @@
       var receiveDataPipe = new MojoDataPipe();
       _socketReceiver = receiveDataPipe.consumer;
       _socket = new TcpConnectedSocketProxy.unbound();
-      await boundSocket.ptr.connect(remote_address, sendDataPipe.consumer,
+      await boundSocket.connect(remote_address, sendDataPipe.consumer,
           receiveDataPipe.producer, _socket);
       await boundSocket.close();
 
@@ -91,7 +91,7 @@
 
   void _startReadingFromTerminal() {
     // TODO(vtl): Do we have to do something on error?
-    _terminal.ptr
+    _terminal
         .read(_writeBuffer.lengthInBytes, 0, files.Whence.fromCurrent)
         .then(_onReadFromTerminal)
         .catchError((e) {
@@ -129,7 +129,7 @@
       var numBytesRead = _socketReceiver.read(_readBuffer);
       if (_socketReceiver.status == MojoResult.kOk) {
         assert(numBytesRead > 0);
-        _terminal.ptr
+        _terminal
             .write(_readBuffer.buffer.asUint8List(0, numBytesRead), 0,
                 files.Whence.fromCurrent)
             .catchError((e) {
@@ -188,7 +188,7 @@
       remote_address = _getNetAddressFromUrl(url);
     } catch (e) {
       fputs(
-          terminal.ptr,
+          terminal,
           'HALP: Add a query: ?host=<host>&port=<port>\n'
               '(<host> must be "localhost" or n1.n2.n3.n4)\n\n'
               'Got query parameters:\n' +
@@ -199,7 +199,7 @@
 
     // TODO(vtl): Currently, we only do IPv4, so this should work.
     fputs(
-        terminal.ptr,
+        terminal,
         'Connecting to: ' +
             remote_address.ipv4.addr.join('.') +
             ':' +
diff --git a/examples/dart/wget/lib/main.dart b/examples/dart/wget/lib/main.dart
index bf4ceba..2563dab 100644
--- a/examples/dart/wget/lib/main.dart
+++ b/examples/dart/wget/lib/main.dart
@@ -47,7 +47,7 @@
       ..url = url
       ..autoFollowRedirects = true;
 
-    var urlResponse = await _urlLoader.ptr.start(urlRequest);
+    var urlResponse = await _urlLoader.start(urlRequest);
     print(">>> Headers <<<");
     print(urlResponse.response.headers.join('\n'));
 
@@ -61,7 +61,7 @@
     }
     if (_urlLoader == null) {
       _urlLoader = new UrlLoaderProxy.unbound();
-      _networkService.ptr.createUrlLoader(_urlLoader);
+      _networkService.createUrlLoader(_urlLoader);
     }
   }
 
diff --git a/mojo/dart/apptests/dart_apptests/lib/src/connect_to_loader_apptests.dart b/mojo/dart/apptests/dart_apptests/lib/src/connect_to_loader_apptests.dart
index e5a9008..0f4cee4 100644
--- a/mojo/dart/apptests/dart_apptests/lib/src/connect_to_loader_apptests.dart
+++ b/mojo/dart/apptests/dart_apptests/lib/src/connect_to_loader_apptests.dart
@@ -20,7 +20,7 @@
         "mojo:url_response_disk_cache", diskCacheProxy);
     var response = new UrlResponse();
     response.url = 'http://www.example.com';
-    await diskCacheProxy.ptr.updateAndGet(response);
+    await diskCacheProxy.updateAndGet(response);
     await diskCacheProxy.close();
   });
 }
diff --git a/mojo/dart/apptests/dart_apptests/lib/src/echo_apptests.dart b/mojo/dart/apptests/dart_apptests/lib/src/echo_apptests.dart
index a873ecd..6937ed0 100644
--- a/mojo/dart/apptests/dart_apptests/lib/src/echo_apptests.dart
+++ b/mojo/dart/apptests/dart_apptests/lib/src/echo_apptests.dart
@@ -18,10 +18,10 @@
       var echoProxy =
           new EchoServiceProxy.connectToService(application, "mojo:dart_echo");
 
-      var v = await echoProxy.ptr.echoString("foo");
+      var v = await echoProxy.echoString("foo");
       expect(v.value, equals("foo"));
 
-      var q = await echoProxy.ptr.echoString("quit");
+      var q = await echoProxy.echoString("quit");
       expect(q.value, equals("quit"));
 
       await echoProxy.close();
@@ -31,10 +31,10 @@
       var echoProxy =
           new EchoServiceProxy.connectToService(application, "mojo:dart_echo");
 
-      var v = await echoProxy.ptr.echoString("");
+      var v = await echoProxy.echoString("");
       expect(v.value, equals(""));
 
-      var q = await echoProxy.ptr.echoString("quit");
+      var q = await echoProxy.echoString("quit");
       expect(q.value, equals("quit"));
 
       await echoProxy.close();
@@ -44,10 +44,10 @@
       var echoProxy =
           new EchoServiceProxy.connectToService(application, "mojo:dart_echo");
 
-      var v = await echoProxy.ptr.echoString(null);
+      var v = await echoProxy.echoString(null);
       expect(v.value, equals(null));
 
-      var q = await echoProxy.ptr.echoString("quit");
+      var q = await echoProxy.echoString("quit");
       expect(q.value, equals("quit"));
 
       await echoProxy.close();
@@ -59,12 +59,12 @@
 
       var milliseconds = 100;
       var watch = new Stopwatch()..start();
-      var v = await echoProxy.ptr.delayedEchoString("foo", milliseconds);
+      var v = await echoProxy.delayedEchoString("foo", milliseconds);
       var elapsed = watch.elapsedMilliseconds;
       expect(v.value, equals("foo"));
       expect(elapsed, greaterThanOrEqualTo(milliseconds));
 
-      var q = await echoProxy.ptr.echoString("quit");
+      var q = await echoProxy.echoString("quit");
       expect(q.value, equals("quit"));
 
       await echoProxy.close();
@@ -75,7 +75,7 @@
           new EchoServiceProxy.connectToService(application, "mojo:dart_echo");
 
       var milliseconds = 100;
-      echoProxy.responseOrError(echoProxy.ptr.delayedEchoString(
+      echoProxy.responseOrError(echoProxy.delayedEchoString(
           "quit", milliseconds)).then((result) {
         fail('This future should not complete.');
       }, onError: (e) {
@@ -92,26 +92,26 @@
 
       for (int i = 0; i < 10; i++) {
         var v =
-            await echoProxy.responseOrError(echoProxy.ptr.echoString("foo"));
+            await echoProxy.responseOrError(echoProxy.echoString("foo"));
         expect(v.value, equals("foo"));
       }
 
-      echoProxy.impl.errorFuture.then((e) {
+      echoProxy.ctrl.errorFuture.then((e) {
         fail("echoProxy: $e");
       });
 
       // Trigger an implementation swap in the echo server.
-      echoProxy.ptr.swap();
+      echoProxy.swap();
 
-      expect(echoProxy.impl.isBound, isTrue);
+      expect(echoProxy.ctrl.isBound, isTrue);
 
       for (int i = 0; i < 10; i++) {
         var v =
-            await echoProxy.responseOrError(echoProxy.ptr.echoString("foo"));
+            await echoProxy.responseOrError(echoProxy.echoString("foo"));
         expect(v.value, equals("foo"));
       }
 
-      var q = await echoProxy.responseOrError(echoProxy.ptr.echoString("quit"));
+      var q = await echoProxy.responseOrError(echoProxy.echoString("quit"));
       expect(q.value, equals("quit"));
 
       await echoProxy.close();
@@ -123,7 +123,7 @@
 
       List<Future> futures = [];
       for (int i = 0; i < 100; i++) {
-        var f = echoProxy.responseOrError(echoProxy.ptr.echoString("foo"))
+        var f = echoProxy.responseOrError(echoProxy.echoString("foo"))
                          .then((r) {
           expect(r.value, equals("foo"));
         }, onError: (e) {
@@ -142,7 +142,7 @@
       var milliseconds = 100;
       for (int i = 0; i < 100; i++) {
         var f = echoProxy.responseOrError(
-            echoProxy.ptr.delayedEchoString("foo", milliseconds)).then((_) {
+            echoProxy.delayedEchoString("foo", milliseconds)).then((_) {
           fail('This call should fail');
         }, onError: (e) {
           expect(e is ProxyError, isTrue);
@@ -157,14 +157,14 @@
           new EchoServiceProxy.connectToService(application, "mojo:dart_echo");
 
       // Do a normal call.
-      var v = await echoProxy.ptr.echoString("foo");
+      var v = await echoProxy.echoString("foo");
       expect(v.value, equals("foo"));
 
       // Close the proxy.
       await echoProxy.close();
 
       // Try to do another call, which should not return.
-      echoProxy.ptr.echoString("foo").then((_) {
+      echoProxy.echoString("foo").then((_) {
         fail('This should be unreachable');
       });
     });
@@ -174,7 +174,7 @@
           new EchoServiceProxy.connectToService(application, "mojo:dart_echo");
 
       // Do a normal call.
-      var v = await echoProxy.ptr.echoString("foo");
+      var v = await echoProxy.echoString("foo");
       expect(v.value, equals("foo"));
 
       // Close the proxy.
@@ -183,7 +183,7 @@
       // Try to do another call, which should fail.
       bool caughtException = false;
       try {
-        v = await echoProxy.responseOrError(echoProxy.ptr.echoString("foo"));
+        v = await echoProxy.responseOrError(echoProxy.echoString("foo"));
         fail('This should be unreachable');
       } on ProxyError catch (e) {
         caughtException = true;
@@ -196,7 +196,7 @@
           new EchoServiceProxy.connectToService(application, "mojo:dart_echo");
 
       // Do a normal call.
-      var v = await echoProxy.ptr.echoString("foo");
+      var v = await echoProxy.echoString("foo");
       expect(v.value, equals("foo"));
 
       // Close the proxy.
@@ -205,7 +205,7 @@
       // Try to do another call, which should fail.
       bool caughtException = false;
       try {
-        v = await echoProxy.responseOrError(echoProxy.ptr.echoString("foo"));
+        v = await echoProxy.responseOrError(echoProxy.echoString("foo"));
         fail('This should be unreachable');
       } on ProxyError catch (e) {
         caughtException = true;
@@ -215,7 +215,7 @@
       // Make sure we can catch an error more than once.
       caughtException = false;
       try {
-        v = await echoProxy.responseOrError(echoProxy.ptr.echoString("foo"));
+        v = await echoProxy.responseOrError(echoProxy.echoString("foo"));
         fail('This should be unreachable');
       } on ProxyError catch (e) {
         caughtException = true;
@@ -228,21 +228,21 @@
           new EchoServiceProxy.connectToService(application, "mojo:dart_echo");
 
       // Do a normal call.
-      var v = await echoProxy.ptr.echoString("foo");
+      var v = await echoProxy.echoString("foo");
       expect(v.value, equals("foo"));
 
       // Close the proxy.
       await echoProxy.close();
 
       // Queue up two calls after the close, and make sure they both fail.
-      var f1 = echoProxy.responseOrError(echoProxy.ptr.echoString("foo"))
+      var f1 = echoProxy.responseOrError(echoProxy.echoString("foo"))
                         .then((_) {
         fail('This should be unreachable');
       }, onError: (e) {
         expect(e is ProxyError, isTrue);
       });
 
-      var f2 = echoProxy.responseOrError(echoProxy.ptr.echoString("foo"))
+      var f2 = echoProxy.responseOrError(echoProxy.echoString("foo"))
                         .then((_) {
         fail('This should be unreachable');
       }, onError: (e) {
@@ -256,10 +256,10 @@
       var echoProxy =
           new EchoServiceProxy.connectToService(application, "mojo:dart_echo");
 
-      var r = await echoProxy.responseOrError(echoProxy.ptr.echoString("foo"));
+      var r = await echoProxy.responseOrError(echoProxy.echoString("foo"));
       expect(r.value, equals("foo"));
 
-      var endpoint = echoProxy.impl.unbind();
+      var endpoint = echoProxy.ctrl.unbind();
       await echoProxy.close();
       endpoint.close();
     });
@@ -268,13 +268,13 @@
       var echoProxy =
           new EchoServiceProxy.connectToService(application, "mojo:dart_echo");
 
-      var r = await echoProxy.responseOrError(echoProxy.ptr.echoString("foo"));
+      var r = await echoProxy.responseOrError(echoProxy.echoString("foo"));
       expect(r.value, equals("foo"));
 
-      var endpoint = echoProxy.impl.unbind();
-      echoProxy.impl.bind(endpoint);
+      var endpoint = echoProxy.ctrl.unbind();
+      echoProxy.ctrl.bind(endpoint);
 
-      r = await echoProxy.responseOrError(echoProxy.ptr.echoString("foo"));
+      r = await echoProxy.responseOrError(echoProxy.echoString("foo"));
       expect(r.value, equals("foo"));
 
       await echoProxy.close();
@@ -284,14 +284,14 @@
       var echoProxy =
           new EchoServiceProxy.connectToService(application, "mojo:dart_echo");
 
-      var r = await echoProxy.responseOrError(echoProxy.ptr.echoString("foo"));
+      var r = await echoProxy.responseOrError(echoProxy.echoString("foo"));
       expect(r.value, equals("foo"));
 
-      var endpoint = echoProxy.impl.unbind();
+      var endpoint = echoProxy.ctrl.unbind();
       var differentEchoProxy = new EchoServiceProxy.fromEndpoint(endpoint);
 
       r = await differentEchoProxy.responseOrError(
-          differentEchoProxy.ptr.echoString("foo"));
+          differentEchoProxy.echoString("foo"));
       expect(r.value, equals("foo"));
 
       await differentEchoProxy.close();
@@ -301,15 +301,15 @@
       var echoProxy =
           new EchoServiceProxy.connectToService(application, "mojo:dart_echo");
 
-      var r = await echoProxy.responseOrError(echoProxy.ptr.echoString("foo"));
+      var r = await echoProxy.responseOrError(echoProxy.echoString("foo"));
       expect(r.value, equals("foo"));
 
-      var endpoint = echoProxy.impl.unbind();
+      var endpoint = echoProxy.ctrl.unbind();
       var differentEchoProxy = new EchoServiceProxy.fromEndpoint(endpoint);
       await echoProxy.close();
 
       r = await differentEchoProxy.responseOrError(
-          differentEchoProxy.ptr.echoString("foo"));
+          differentEchoProxy.echoString("foo"));
       expect(r.value, equals("foo"));
 
       await differentEchoProxy.close();
diff --git a/mojo/dart/apptests/dart_apptests/lib/src/pingpong_apptests.dart b/mojo/dart/apptests/dart_apptests/lib/src/pingpong_apptests.dart
index bc278e2..a673abe 100644
--- a/mojo/dart/apptests/dart_apptests/lib/src/pingpong_apptests.dart
+++ b/mojo/dart/apptests/dart_apptests/lib/src/pingpong_apptests.dart
@@ -37,18 +37,18 @@
     // and sends responses to our client.
     test('Ping Service To Pong Client', () async {
       var pingPongServiceProxy = new PingPongServiceProxy.unbound();
-      pingPongServiceProxy.errorFuture.then((e) => fail('$e'));
+      pingPongServiceProxy.ctrl.errorFuture.then((e) => fail('$e'));
       application.connectToService(
           "mojo:dart_pingpong", pingPongServiceProxy);
 
       var pingPongClient = new _TestingPingPongClient.unbound();
-      pingPongServiceProxy.ptr.setClient(pingPongClient.stub);
+      pingPongServiceProxy.setClient(pingPongClient.stub);
 
-      pingPongServiceProxy.ptr.ping(1);
+      pingPongServiceProxy.ping(1);
       var pongValue = await pingPongClient.waitForPong();
       expect(pongValue, equals(2));
 
-      pingPongServiceProxy.ptr.ping(100);
+      pingPongServiceProxy.ping(100);
       pongValue = await pingPongClient.waitForPong();
       expect(pongValue, equals(101));
 
@@ -61,11 +61,11 @@
     // target.ping() => client.pong() methods have executed 9 times.
     test('Ping Target URL', () async {
       var pingPongServiceProxy = new PingPongServiceProxy.unbound();
-      pingPongServiceProxy.errorFuture.then((e) => fail('$e'));
+      pingPongServiceProxy.ctrl.errorFuture.then((e) => fail('$e'));
       application.connectToService(
           "mojo:dart_pingpong", pingPongServiceProxy);
 
-      var r = await pingPongServiceProxy.ptr.pingTargetUrl(
+      var r = await pingPongServiceProxy.pingTargetUrl(
           "mojo:dart_pingpong_target", 9);
       expect(r.ok, equals(true));
 
@@ -76,21 +76,21 @@
     // pingpong_target.dart URL, we provide a connection to its PingPongService.
     test('Ping Target Service', () async {
       var pingPongServiceProxy = new PingPongServiceProxy.unbound();
-      pingPongServiceProxy.errorFuture.then((e) => fail('$e'));
+      pingPongServiceProxy.ctrl.errorFuture.then((e) => fail('$e'));
       application.connectToService(
           "mojo:dart_pingpong", pingPongServiceProxy);
 
       var targetServiceProxy = new PingPongServiceProxy.unbound();
-      targetServiceProxy.errorFuture.then((e) => fail('$e'));
+      targetServiceProxy.ctrl.errorFuture.then((e) => fail('$e'));
       application.connectToService(
           "mojo:dart_pingpong_target", targetServiceProxy);
 
-      var r = await pingPongServiceProxy.ptr.pingTargetService(
-          targetServiceProxy.impl, 9);
+      var r = await pingPongServiceProxy.pingTargetService(
+          targetServiceProxy, 9);
       expect(r.ok, equals(true));
       // This side no longer has access to the pipe.
-      expect(targetServiceProxy.impl.isOpen, equals(false));
-      expect(targetServiceProxy.impl.isBound, equals(false));
+      expect(targetServiceProxy.ctrl.isOpen, equals(false));
+      expect(targetServiceProxy.ctrl.isBound, equals(false));
 
       await pingPongServiceProxy.close();
     });
@@ -98,22 +98,22 @@
     // Verify that Dart can implement an interface "request" parameter.
     test('Get Target Service', () async {
       var pingPongServiceProxy = new PingPongServiceProxy.unbound();
-      pingPongServiceProxy.errorFuture.then((e) => fail('$e'));
+      pingPongServiceProxy.ctrl.errorFuture.then((e) => fail('$e'));
       application.connectToService(
           "mojo:dart_pingpong", pingPongServiceProxy);
 
       var targetServiceProxy = new PingPongServiceProxy.unbound();
-      targetServiceProxy.errorFuture.then((e) => fail('$e'));
-      pingPongServiceProxy.ptr.getPingPongService(targetServiceProxy);
+      targetServiceProxy.ctrl.errorFuture.then((e) => fail('$e'));
+      pingPongServiceProxy.getPingPongService(targetServiceProxy);
 
       var pingPongClient = new _TestingPingPongClient.unbound();
-      targetServiceProxy.ptr.setClient(pingPongClient.stub);
+      targetServiceProxy.setClient(pingPongClient.stub);
 
-      targetServiceProxy.ptr.ping(1);
+      targetServiceProxy.ping(1);
       var pongValue = await pingPongClient.waitForPong();
       expect(pongValue, equals(2));
 
-      targetServiceProxy.ptr.ping(100);
+      targetServiceProxy.ping(100);
       pongValue = await pingPongClient.waitForPong();
       expect(pongValue, equals(101));
 
@@ -127,22 +127,22 @@
     // delay.
     test('Get Target Service Delayed', () async {
       var pingPongServiceProxy = new PingPongServiceProxy.unbound();
-      pingPongServiceProxy.errorFuture.then((e) => fail('$e'));
+      pingPongServiceProxy.ctrl.errorFuture.then((e) => fail('$e'));
       application.connectToService(
           "mojo:dart_pingpong", pingPongServiceProxy);
 
       var targetServiceProxy = new PingPongServiceProxy.unbound();
-      targetServiceProxy.errorFuture.then((e) => fail('$e'));
-      pingPongServiceProxy.ptr.getPingPongServiceDelayed(targetServiceProxy);
+      targetServiceProxy.ctrl.errorFuture.then((e) => fail('$e'));
+      pingPongServiceProxy.getPingPongServiceDelayed(targetServiceProxy);
 
       var pingPongClient = new _TestingPingPongClient.unbound();
-      targetServiceProxy.ptr.setClient(pingPongClient.stub);
+      targetServiceProxy.setClient(pingPongClient.stub);
 
-      targetServiceProxy.ptr.ping(1);
+      targetServiceProxy.ping(1);
       var pongValue = await pingPongClient.waitForPong();
       expect(pongValue, equals(2));
 
-      targetServiceProxy.ptr.ping(100);
+      targetServiceProxy.ping(100);
       pongValue = await pingPongClient.waitForPong();
       expect(pongValue, equals(101));
 
diff --git a/mojo/dart/apptests/dart_apptests/lib/src/service_describer_apptests.dart b/mojo/dart/apptests/dart_apptests/lib/src/service_describer_apptests.dart
index e817722..7f1e7d3 100644
--- a/mojo/dart/apptests/dart_apptests/lib/src/service_describer_apptests.dart
+++ b/mojo/dart/apptests/dart_apptests/lib/src/service_describer_apptests.dart
@@ -25,27 +25,26 @@
     test('PingPong Service Verification', () async {
       var serviceDescriberProxy = new service_describer.ServiceDescriberProxy.
           unbound();
-      serviceDescriberProxy.errorFuture.then((v) =>
+      serviceDescriberProxy.ctrl.errorFuture.then((v) =>
           fail('There was an error $v'));
       application.connectToService("mojo:dart_pingpong", serviceDescriberProxy);
 
       var serviceDescriptionProxy =
           new service_describer.ServiceDescriptionProxy.unbound();
-      serviceDescriptionProxy.errorFuture.then(
+      serviceDescriptionProxy.ctrl.errorFuture.then(
           (v) => fail('There was an error $v'));
 
-      serviceDescriberProxy.ptr.describeService(
+      serviceDescriberProxy.describeService(
           "test::PingPongService", serviceDescriptionProxy);
 
       // Compare the service description obtained by the service describer and
       // the expected description taken from the pingpong service import.
-      var serviceDescription = serviceDescriptionProxy.ptr;
+      var serviceDescription = serviceDescriptionProxy;
       var serviceDescription2 = pingpong_service.PingPongServiceStub.
         serviceDescription;
 
       Function identity = (v) => v;
 
-
       // Top-level Mojom Interfaces must match.
       mojom_types.MojomInterface interfaceA =
           (await serviceDescriptionProxy.responseOrError(
diff --git a/mojo/dart/apptests/dart_apptests/lib/src/versioning_apptests.dart b/mojo/dart/apptests/dart_apptests/lib/src/versioning_apptests.dart
index 9de446a..5559831 100644
--- a/mojo/dart/apptests/dart_apptests/lib/src/versioning_apptests.dart
+++ b/mojo/dart/apptests/dart_apptests/lib/src/versioning_apptests.dart
@@ -27,7 +27,7 @@
       // know about the birthday field).
       bool retrieveFingerPrint = true;
       var response =
-          await databaseProxy.ptr.queryEmployee(1, retrieveFingerPrint);
+          await databaseProxy.queryEmployee(1, retrieveFingerPrint);
       expect(response.employee.employeeId, equals(1));
       expect(response.employee.name, equals("Homer Simpson"));
       expect(response.employee.department, equals(Department.dev));
@@ -39,12 +39,12 @@
       newEmployee.employeeId = 2;
       newEmployee.name = "Marge Simpson";
       newEmployee.department = Department.sales;
-      response = await databaseProxy.ptr.addEmployee(newEmployee);
+      response = await databaseProxy.addEmployee(newEmployee);
       expect(response.success, isTrue);
 
       // Query for employee #2.
       retrieveFingerPrint = false;
-      response = await databaseProxy.ptr.queryEmployee(2, retrieveFingerPrint);
+      response = await databaseProxy.queryEmployee(2, retrieveFingerPrint);
       expect(response.employee.employeeId, equals(2));
       expect(response.employee.name, equals("Marge Simpson"));
       expect(response.employee.department, equals(Department.sales));
@@ -60,7 +60,7 @@
       application.connectToService(
           "mojo:versioning_test_service", databaseProxy);
       // Query the version.
-      var version = await databaseProxy.queryVersion();
+      var version = await databaseProxy.ctrl.queryVersion();
       // Expect it to be 1.
       expect(version, equals(1));
       // Disconnect from database.
@@ -74,26 +74,26 @@
           "mojo:versioning_test_service", databaseProxy);
 
       // Require version 1.
-      databaseProxy.requireVersion(1);
-      expect(databaseProxy.version, equals(1));
+      databaseProxy.ctrl.requireVersion(1);
+      expect(databaseProxy.ctrl.version, equals(1));
 
       // Query for employee #3.
       var retrieveFingerPrint = false;
       var response =
-          await databaseProxy.ptr.queryEmployee(3, retrieveFingerPrint);
+          await databaseProxy.queryEmployee(3, retrieveFingerPrint);
 
       // Got some kind of response.
       expect(response, isNotNull);
 
       // Require version 3 (which cannot be satisfied).
-      databaseProxy.requireVersion(3);
-      expect(databaseProxy.version, equals(3));
+      databaseProxy.ctrl.requireVersion(3);
+      expect(databaseProxy.ctrl.version, equals(3));
 
       // Query for employee #1, observe that the call fails.
       bool exceptionCaught = false;
       try {
         response = await databaseProxy.responseOrError(
-            databaseProxy.ptr.queryEmployee(1, retrieveFingerPrint));
+            databaseProxy.queryEmployee(1, retrieveFingerPrint));
         fail('Exception should be thrown.');
       } catch (e) {
         exceptionCaught = true;
@@ -117,7 +117,7 @@
       // Although the client side doesn't know whether the service side supports
       // version 1, calling a version 1 method succeeds as long as the service
       // side supports version 1.
-      var response = await databaseProxy.ptr.attachFingerPrint(1, fingerPrint);
+      var response = await databaseProxy.attachFingerPrint(1, fingerPrint);
       expect(response.success, isTrue);
 
       // Calling a version 2 method (which the service side doesn't support)
@@ -125,7 +125,7 @@
       bool exceptionCaught = false;
       try {
         response = await databaseProxy
-            .responseOrError(databaseProxy.ptr.listEmployeeIds());
+            .responseOrError(databaseProxy.listEmployeeIds());
         fail('Exception should be thrown.');
       } catch (e) {
         exceptionCaught = true;
diff --git a/mojo/dart/apptests/test_apps/pingpong/lib/main.dart b/mojo/dart/apptests/test_apps/pingpong/lib/main.dart
index 5a3a695..e450290 100644
--- a/mojo/dart/apptests/test_apps/pingpong/lib/main.dart
+++ b/mojo/dart/apptests/test_apps/pingpong/lib/main.dart
@@ -41,14 +41,14 @@
     _stub.impl = this;
   }
 
-  void setClient(ProxyBase proxyBase) {
+  void setClient(Proxy proxy) {
     assert(_pingPongClient == null);
-    _pingPongClient = proxyBase;
+    _pingPongClient = proxy;
   }
 
   void ping(int pingValue) {
     if (_pingPongClient != null) {
-      _pingPongClient.ptr.pong(pingValue + 1);
+      _pingPongClient.pong(pingValue + 1);
     }
   }
 
@@ -62,10 +62,10 @@
     _application.connectToService(url, pingPongService);
 
     var pingPongClient = new PingPongClientImpl.unbound(count, completer);
-    pingPongService.ptr.setClient(pingPongClient.stub);
+    pingPongService.setClient(pingPongClient.stub);
 
     for (var i = 0; i < count; i++) {
-      pingPongService.ptr.ping(i);
+      pingPongService.ping(i);
     }
     await completer.future;
     await pingPongService.close();
@@ -73,15 +73,15 @@
     return responseFactory(true);
   }
 
-  Future pingTargetService(ProxyBase proxyBase, int count,
+  Future pingTargetService(Proxy proxy, int count,
       [Function responseFactory]) async {
-    var pingPongService = proxyBase;
+    var pingPongService = proxy;
     var completer = new Completer();
     var client = new PingPongClientImpl.unbound(count, completer);
-    pingPongService.ptr.setClient(client.stub);
+    pingPongService.setClient(client.stub);
 
     for (var i = 0; i < count; i++) {
-      pingPongService.ptr.ping(i);
+      pingPongService.ping(i);
     }
     await completer.future;
     await pingPongService.close();
@@ -96,7 +96,7 @@
 
     // Pass along the interface request to another implementation of the
     // service.
-    targetServiceProxy.ptr.getPingPongService(serviceStub);
+    targetServiceProxy.getPingPongService(serviceStub);
     targetServiceProxy.close();
   }
 
@@ -111,7 +111,7 @@
         // Pass along the interface request to another implementation of the
         // service.
         serviceStub.bind(endpoint);
-        targetServiceProxy.ptr.getPingPongService(serviceStub);
+        targetServiceProxy.getPingPongService(serviceStub);
         targetServiceProxy.close();
       });
     });
diff --git a/mojo/dart/apptests/test_apps/pingpong_target/lib/main.dart b/mojo/dart/apptests/test_apps/pingpong_target/lib/main.dart
index 5c619ef..4f35f9b 100644
--- a/mojo/dart/apptests/test_apps/pingpong_target/lib/main.dart
+++ b/mojo/dart/apptests/test_apps/pingpong_target/lib/main.dart
@@ -23,12 +23,12 @@
     _stub.impl = this;
   }
 
-  void setClient(ProxyBase proxyBase) {
+  void setClient(Proxy proxy) {
     assert(_pingPongClient == null);
-    _pingPongClient = proxyBase;
+    _pingPongClient = proxy;
   }
 
-  void ping(int pingValue) => _pingPongClient.ptr.pong(pingValue + 1);
+  void ping(int pingValue) => _pingPongClient.pong(pingValue + 1);
 
   // These methods are unimplemented; they merely throw on invocation.
   dynamic pingTargetUrl(String url, int count, [Function responseFactory]) =>
diff --git a/mojo/dart/embedder/io/file_patch.dart b/mojo/dart/embedder/io/file_patch.dart
index adcee85..0e376a4 100644
--- a/mojo/dart/embedder/io/file_patch.dart
+++ b/mojo/dart/embedder/io/file_patch.dart
@@ -112,9 +112,9 @@
         types.kOpenFlagRead | types.kOpenFlagWrite | types.kOpenFlagCreate;
     var response =
         await rootDirectory.responseOrError(
-            rootDirectory.ptr.openDirectory(_ensurePathIsRelative(path),
-                                            null,
-                                            flags));
+            rootDirectory.openDirectory(_ensurePathIsRelative(path),
+                                        null,
+                                        flags));
     if (response.error != types.Error.ok) {
       throw _OSErrorFromError(response.error);
     }
@@ -132,7 +132,7 @@
     while (true) {
       var response =
           await rootDirectory.responseOrError(
-              rootDirectory.ptr.openDirectory(tempPath, null, flags));
+              rootDirectory.openDirectory(tempPath, null, flags));
       if (response.error == types.Error.ok) {
         // Success.
         break;
@@ -151,9 +151,9 @@
     int flags = types.kOpenFlagRead | types.kOpenFlagWrite;
     var response =
         await await rootDirectory.responseOrError(
-            rootDirectory.ptr.openDirectory(_ensurePathIsRelative(path),
-                                            null,
-                                            flags));
+            rootDirectory.openDirectory(_ensurePathIsRelative(path),
+                                        null,
+                                        flags));
     // If we can open it, it exists.
     return response.error == types.Error.ok;
   }
@@ -182,8 +182,8 @@
   /* patch */ Future<Directory> rename(String newPath) async {
     DirectoryProxy rootDirectory = await _getRootDirectory();
     var response = await rootDirectory.responseOrError(
-        rootDirectory.ptr.rename(_ensurePathIsRelative(path),
-                                 _ensurePathIsRelative(newPath)));
+        rootDirectory.rename(_ensurePathIsRelative(path),
+                             _ensurePathIsRelative(newPath)));
     if (response.error != types.Error.ok) {
       throw _OSErrorFromError(response.error);
     }
@@ -250,15 +250,15 @@
       DirectoryProxy directory = new DirectoryProxy.unbound();
       var response =
           await rootDirectory.responseOrError(
-              rootDirectory.ptr.openDirectory(_ensurePathIsRelative(path),
-                                              directory,
-                                              flags));
+              rootDirectory.openDirectory(_ensurePathIsRelative(path),
+                                          directory,
+                                          flags));
       if (response.error != types.Error.ok) {
         // Skip if we can't open it.
         continue;
       }
       // Read contents.
-      var readResponse = await directory.responseOrError(directory.ptr.read());
+      var readResponse = await directory.responseOrError(directory.read());
       // We are done with the directory now.
       directory.close(immediate: true);
       if (readResponse.error != types.Error.ok) {
@@ -291,9 +291,9 @@
     int flags = types.kOpenFlagRead;
     var response =
         await rootDirectory.responseOrError(
-            rootDirectory.ptr.openFile(_ensurePathIsRelative(path),
-                                       null,
-                                       flags));
+            rootDirectory.openFile(_ensurePathIsRelative(path),
+                                   null,
+                                   flags));
     // If we can open it, it exists.
     return response.error == types.Error.ok;
   }
@@ -311,9 +311,9 @@
     int flags = types.kOpenFlagWrite | types.kOpenFlagCreate;
     var response =
         await rootDirectory.responseOrError(
-            rootDirectory.ptr.openFile(_ensurePathIsRelative(path),
-                                       null,
-                                       flags));
+            rootDirectory.openFile(_ensurePathIsRelative(path),
+                                   null,
+                                   flags));
     if (response.error != types.Error.ok) {
       throw _OSErrorFromError(response.error);
     }
@@ -325,8 +325,8 @@
   /* patch */ Future<File> rename(String newPath) async {
     DirectoryProxy rootDirectory = await _getRootDirectory();
     var response = await rootDirectory.responseOrError(
-        rootDirectory.ptr.rename(_ensurePathIsRelative(path),
-                                 _ensurePathIsRelative(newPath)));
+        rootDirectory.rename(_ensurePathIsRelative(path),
+                             _ensurePathIsRelative(newPath)));
     if (response.error != types.Error.ok) {
       throw _OSErrorFromError(response.error);
     }
@@ -353,14 +353,14 @@
     DirectoryProxy rootDirectory = await _getRootDirectory();
     FileProxy file = new FileProxy.unbound();
     var response = await rootDirectory.responseOrError(
-        rootDirectory.ptr.openFile(_ensurePathIsRelative(path),
-                                   file,
-                                   _openFlagsFromFileMode(mode)));
+        rootDirectory.openFile(_ensurePathIsRelative(path),
+                               file,
+                               _openFlagsFromFileMode(mode)));
     if (response.error != types.Error.ok) {
       throw _OSErrorFromError(response.error);
     }
     // We use the raw mojo handle as our fd.
-    final int fd = file.impl.endpoint.handle.h;
+    final int fd = file.ctrl.endpoint.handle.h;
     // Construct the RandomAccessFile using the original constructor.
     _RandomAccessFile raf = new _RandomAccessFile(fd, path);
     // Hook up our proxy.
@@ -506,13 +506,13 @@
     DirectoryProxy directory = new DirectoryProxy.unbound();
     var response =
         await await rootDirectory.responseOrError(
-            rootDirectory.ptr.openDirectory(_ensurePathIsRelative(path),
-                                            directory,
-                                            flags));
+            rootDirectory.openDirectory(_ensurePathIsRelative(path),
+                                        directory,
+                                        flags));
     if (response.error != types.Error.ok) {
       throw _OSErrorFromError(response.error);
     }
-    var statResponse = await directory.responseOrError(directory.ptr.stat());
+    var statResponse = await directory.responseOrError(directory.stat());
     // We are done with the directory now.
     directory.close(immediate: true);
     if (statResponse.error != types.Error.ok) {
@@ -553,7 +553,7 @@
     DirectoryProxy rootDirectory = await _getRootDirectory();
     int flags = recursive ? types.kDeleteFlagRecursive : 0;
     var response = await rootDirectory.responseOrError(
-        rootDirectory.ptr.delete(_ensurePathIsRelative(path), flags));
+        rootDirectory.delete(_ensurePathIsRelative(path), flags));
     if (response.error != types.Error.ok) {
       throw _OSErrorFromError(response.error);
     }
@@ -648,7 +648,7 @@
 
   /* patch */ Future<RandomAccessFile> close() async {
     _ensureProxy();
-    await _proxy.responseOrError(_proxy.ptr.close());
+    await _proxy.responseOrError(_proxy.close());
     await _proxy.close(immediate: true);
     _proxy = null;
     closed = true;
@@ -663,7 +663,7 @@
   /* patch */ Future<int> readByte() async {
     _ensureProxy();
     var response = await _proxy.responseOrError(
-        _proxy.ptr.read(1, 0, types.Whence.fromCurrent));
+        _proxy.read(1, 0, types.Whence.fromCurrent));
     _handleError(response);
     _resourceInfo.addRead(response.bytesRead.length);
     if (response.bytesRead.length == 0) {
@@ -682,7 +682,7 @@
     }
     _ensureProxy();
     var response = await _proxy.responseOrError(
-        _proxy.ptr.read(bytes, 0, types.Whence.fromCurrent));
+        _proxy.read(bytes, 0, types.Whence.fromCurrent));
     _handleError(response);
     _resourceInfo.addRead(response.bytesRead.length);
     return response.bytesRead;
@@ -706,7 +706,7 @@
     }
     int length = end - start;
     var response = await _proxy.responseOrError(
-        _proxy.ptr.read(length, 0, types.Whence.fromCurrent));
+        _proxy.read(length, 0, types.Whence.fromCurrent));
     _handleError(response);
     int read = response.bytesRead.length;
     _resourceInfo.addRead(read);
@@ -724,7 +724,7 @@
     }
     _ensureProxy();
     var response = await _proxy.responseOrError(
-        _proxy.ptr.write([value], 0, types.Whence.fromCurrent));
+        _proxy.write([value], 0, types.Whence.fromCurrent));
     _handleError(response);
     assert(response.numBytesWritten == 1);
     _resourceInfo.addWrite(response.numBytesWritten);
@@ -762,7 +762,7 @@
     }
     assert(result.start == 0);
     var response = await _proxy.responseOrError(
-        _proxy.ptr.write(result.buffer, 0, types.Whence.fromCurrent));
+        _proxy.write(result.buffer, 0, types.Whence.fromCurrent));
     _handleError(response);
     _resourceInfo.addWrite(response.numBytesWritten);
     return this;
@@ -778,7 +778,7 @@
 
   /* patch */ Future<int> position() async {
     _ensureProxy();
-    var response = await _proxy.responseOrError(_proxy.ptr.tell());
+    var response = await _proxy.responseOrError(_proxy.tell());
     _handleError(response);
     return response.position;
   }
@@ -793,7 +793,7 @@
     }
     _ensureProxy();
     var response = await _proxy.responseOrError(
-        _proxy.ptr.seek(position, types.Whence.fromStart));
+        _proxy.seek(position, types.Whence.fromStart));
     _handleError(response);
     return this;
   }
@@ -807,7 +807,7 @@
       throw new ArgumentError(length);
     }
     _ensureProxy();
-    var response = await _proxy.responseOrError(_proxy.ptr.truncate(length));
+    var response = await _proxy.responseOrError(_proxy.truncate(length));
     _handleError(response);
   }
 
@@ -817,7 +817,7 @@
 
   /* patch */ Future<int> length() async {
     _ensureProxy();
-    var response = await _proxy.responseOrError(_proxy.ptr.stat());
+    var response = await _proxy.responseOrError(_proxy.stat());
     _handleError(response);
     return response.fileInformation.size;
   }
diff --git a/mojo/dart/embedder/io/internet_address_patch.dart b/mojo/dart/embedder/io/internet_address_patch.dart
index 3723bbc..9782893 100644
--- a/mojo/dart/embedder/io/internet_address_patch.dart
+++ b/mojo/dart/embedder/io/internet_address_patch.dart
@@ -199,7 +199,7 @@
   static Future _lookup(String host, InternetAddressType type) async {
     HostResolverProxy hostResolver = _getHostResolver();
     var family = _internetAddressTypeToAddressFamily(type);
-    var response = await hostResolver.ptr.getHostAddresses(host, family);
+    var response = await hostResolver.getHostAddresses(host, family);
     _NetworkService._throwOnError(response.result);
     var numAddresses = response.addresses.length;
     var r = new List(numAddresses);
diff --git a/mojo/dart/embedder/io/mojo_patch.dart b/mojo/dart/embedder/io/mojo_patch.dart
index 96a62a3..fc059c2 100644
--- a/mojo/dart/embedder/io/mojo_patch.dart
+++ b/mojo/dart/embedder/io/mojo_patch.dart
@@ -114,10 +114,10 @@
     return null;
   }
   _hostResolver = new HostResolverProxy.unbound();
-  networkService.ptr.createHostResolver(_hostResolver);
+  networkService.createHostResolver(_hostResolver);
   // Remove the host resolver's handle from the open set because it is not
   // under application control and does not affect isolate shutdown.
-  _hostResolver.impl.endpoint.handle.pass();
+  _hostResolver.ctrl.endpoint.handle.pass();
   return _hostResolver;
 }
 
@@ -141,10 +141,10 @@
   assert(files != null);
   _rootDirectory = new DirectoryProxy.unbound();
   var response =
-      await files.ptr.openFileSystem(fileSystemName, _rootDirectory);
+      await files.openFileSystem(fileSystemName, _rootDirectory);
   // Remove the root directory's handle from the open set because it is not
   // under application control and does not affect isolate shutdown.
-  _rootDirectory.impl.endpoint.handle.pass();
+  _rootDirectory.ctrl.endpoint.handle.pass();
 
   // Ensure system temporary directory exists before returning the root
   // directory.
@@ -163,13 +163,13 @@
               types.kOpenFlagCreate;
   _systemTempDirectory = new DirectoryProxy.unbound();
   var response =
-      await rootDirectory.ptr.openDirectory(systemTempPath,
-                                            _systemTempDirectory,
-                                            flags);
+      await rootDirectory.openDirectory(systemTempPath,
+                                        _systemTempDirectory,
+                                        flags);
   assert(response.error == types.Error.ok);
   // Remove the system temp directory's handle from the open set because it
   // is not under application control and does not affect isolate shutdown.
-  _systemTempDirectory.impl.endpoint.handle.pass();
+  _systemTempDirectory.ctrl.endpoint.handle.pass();
   return _systemTempDirectory;
 }
 
diff --git a/mojo/dart/embedder/io/server_socket_patch.dart b/mojo/dart/embedder/io/server_socket_patch.dart
index 9b4274a..fd5fea8 100644
--- a/mojo/dart/embedder/io/server_socket_patch.dart
+++ b/mojo/dart/embedder/io/server_socket_patch.dart
@@ -45,7 +45,7 @@
                                             bool v6Only,
                                             bool shared) async {
     final rawServerSocket = new _MojoRawServerSocket(v6Only);
-    final networkService = _getNetworkService().ptr;
+    final networkService = _getNetworkService();
     assert(networkService != null);
     var response =
         await networkService.createTcpBoundSocket(
@@ -59,7 +59,7 @@
         _NetworkServiceCodec._fromNetAddress(response.boundTo);
     rawServerSocket._boundPort =
         _NetworkServiceCodec._portFromNetAddress(response.boundTo);
-    final boundSocket = rawServerSocket._tcpBoundSocket.ptr;
+    final boundSocket = rawServerSocket._tcpBoundSocket;
     response =
         await boundSocket.startListening(rawServerSocket._tcpServerSocket);
     if (!_NetworkService._okay(response.result)) {
@@ -103,9 +103,9 @@
     var response;
     try {
       response = await _tcpServerSocket.responseOrError(
-          _tcpServerSocket.ptr.accept(rawSocket._pipeOut.consumer,
-                                      rawSocket._pipeIn.producer,
-                                      rawSocket._tcpConnectedSocket));
+          _tcpServerSocket.accept(rawSocket._pipeOut.consumer,
+                                  rawSocket._pipeIn.producer,
+                                  rawSocket._tcpConnectedSocket));
     } on ProxyError catch (e) {
       rawSocket.destroy();
       await _destroy();
diff --git a/mojo/dart/embedder/io/socket_patch.dart b/mojo/dart/embedder/io/socket_patch.dart
index b40a9f5..f771f64 100644
--- a/mojo/dart/embedder/io/socket_patch.dart
+++ b/mojo/dart/embedder/io/socket_patch.dart
@@ -150,7 +150,7 @@
   static Future<_MojoRawSocket> _connect(NetAddress source,
                                          NetAddress dest) async {
     var rawSocket = new _MojoRawSocket();
-    var networkService = _getNetworkService().ptr;
+    var networkService = _getNetworkService();
     assert(networkService != null);
     var response =
         await networkService.createTcpBoundSocket(source,
@@ -172,7 +172,7 @@
 
     // connect here.
     response =
-        await rawSocket._tcpBoundSocket.ptr.connect(
+        await rawSocket._tcpBoundSocket.connect(
             dest,
             rawSocket._pipeOut.consumer,
             rawSocket._pipeIn.producer,
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 d6c650f..43dae20 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
@@ -894,24 +894,22 @@
 }
 
 
-class _CppSideProxyImpl extends bindings.Proxy {
-  _CppSideProxyImpl.fromEndpoint(
+class _CppSideProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _CppSideProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _CppSideProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _CppSideProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _CppSideProxyImpl.unbound() : super.unbound();
-
-  static _CppSideProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _CppSideProxyImpl"));
-    return new _CppSideProxyImpl.fromEndpoint(endpoint);
-  }
+  _CppSideProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _CppSideServiceDescription();
+      new _CppSideServiceDescription();
 
+  String get serviceName => CppSide.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -921,75 +919,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_CppSideProxyImpl($superString)";
+    return "_CppSideProxyControl($superString)";
   }
 }
 
 
-class _CppSideProxyCalls implements CppSide {
-  _CppSideProxyImpl _proxyImpl;
-
-  _CppSideProxyCalls(this._proxyImpl);
-    void startTest() {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _CppSideStartTestParams();
-      _proxyImpl.sendMessage(params, _cppSideMethodStartTestName);
-    }
-    void testFinished() {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _CppSideTestFinishedParams();
-      _proxyImpl.sendMessage(params, _cppSideMethodTestFinishedName);
-    }
-    void pingResponse() {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _CppSidePingResponseParams();
-      _proxyImpl.sendMessage(params, _cppSideMethodPingResponseName);
-    }
-    void echoResponse(EchoArgsList list) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _CppSideEchoResponseParams();
-      params.list = list;
-      _proxyImpl.sendMessage(params, _cppSideMethodEchoResponseName);
-    }
-}
-
-
-class CppSideProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  CppSide ptr;
-
-  CppSideProxy(_CppSideProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _CppSideProxyCalls(proxyImpl);
-
+class CppSideProxy extends bindings.Proxy
+                              implements CppSide {
   CppSideProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _CppSideProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _CppSideProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _CppSideProxyControl.fromEndpoint(endpoint));
 
-  CppSideProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _CppSideProxyImpl.fromHandle(handle) {
-    ptr = new _CppSideProxyCalls(impl);
-  }
+  CppSideProxy.fromHandle(core.MojoHandle handle)
+      : super(new _CppSideProxyControl.fromHandle(handle));
 
-  CppSideProxy.unbound() :
-      impl = new _CppSideProxyImpl.unbound() {
-    ptr = new _CppSideProxyCalls(impl);
+  CppSideProxy.unbound()
+      : super(new _CppSideProxyControl.unbound());
+
+  static CppSideProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For CppSideProxy"));
+    return new CppSideProxy.fromEndpoint(endpoint);
   }
 
   factory CppSideProxy.connectToService(
@@ -999,30 +952,43 @@
     return p;
   }
 
-  static CppSideProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For CppSideProxy"));
-    return new CppSideProxy.fromEndpoint(endpoint);
+
+  void startTest() {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _CppSideStartTestParams();
+    ctrl.sendMessage(params,
+        _cppSideMethodStartTestName);
   }
-
-  String get serviceName => CppSide.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
+  void testFinished() {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _CppSideTestFinishedParams();
+    ctrl.sendMessage(params,
+        _cppSideMethodTestFinishedName);
   }
-
-  String toString() {
-    return "CppSideProxy($impl)";
+  void pingResponse() {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _CppSidePingResponseParams();
+    ctrl.sendMessage(params,
+        _cppSideMethodPingResponseName);
+  }
+  void echoResponse(EchoArgsList list) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _CppSideEchoResponseParams();
+    params.list = list;
+    ctrl.sendMessage(params,
+        _cppSideMethodEchoResponseName);
   }
 }
 
@@ -1141,24 +1107,22 @@
 }
 
 
-class _DartSideProxyImpl extends bindings.Proxy {
-  _DartSideProxyImpl.fromEndpoint(
+class _DartSideProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _DartSideProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _DartSideProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _DartSideProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _DartSideProxyImpl.unbound() : super.unbound();
-
-  static _DartSideProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _DartSideProxyImpl"));
-    return new _DartSideProxyImpl.fromEndpoint(endpoint);
-  }
+  _DartSideProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _DartSideServiceDescription();
+      new _DartSideServiceDescription();
 
+  String get serviceName => DartSide.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -1168,69 +1132,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_DartSideProxyImpl($superString)";
+    return "_DartSideProxyControl($superString)";
   }
 }
 
 
-class _DartSideProxyCalls implements DartSide {
-  _DartSideProxyImpl _proxyImpl;
-
-  _DartSideProxyCalls(this._proxyImpl);
-    void setClient(Object cppSide) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _DartSideSetClientParams();
-      params.cppSide = cppSide;
-      _proxyImpl.sendMessage(params, _dartSideMethodSetClientName);
-    }
-    void ping() {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _DartSidePingParams();
-      _proxyImpl.sendMessage(params, _dartSideMethodPingName);
-    }
-    void echo(int numIterations, EchoArgs arg) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _DartSideEchoParams();
-      params.numIterations = numIterations;
-      params.arg = arg;
-      _proxyImpl.sendMessage(params, _dartSideMethodEchoName);
-    }
-}
-
-
-class DartSideProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  DartSide ptr;
-
-  DartSideProxy(_DartSideProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _DartSideProxyCalls(proxyImpl);
-
+class DartSideProxy extends bindings.Proxy
+                              implements DartSide {
   DartSideProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _DartSideProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _DartSideProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _DartSideProxyControl.fromEndpoint(endpoint));
 
-  DartSideProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _DartSideProxyImpl.fromHandle(handle) {
-    ptr = new _DartSideProxyCalls(impl);
-  }
+  DartSideProxy.fromHandle(core.MojoHandle handle)
+      : super(new _DartSideProxyControl.fromHandle(handle));
 
-  DartSideProxy.unbound() :
-      impl = new _DartSideProxyImpl.unbound() {
-    ptr = new _DartSideProxyCalls(impl);
+  DartSideProxy.unbound()
+      : super(new _DartSideProxyControl.unbound());
+
+  static DartSideProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For DartSideProxy"));
+    return new DartSideProxy.fromEndpoint(endpoint);
   }
 
   factory DartSideProxy.connectToService(
@@ -1240,30 +1165,36 @@
     return p;
   }
 
-  static DartSideProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For DartSideProxy"));
-    return new DartSideProxy.fromEndpoint(endpoint);
+
+  void setClient(Object cppSide) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _DartSideSetClientParams();
+    params.cppSide = cppSide;
+    ctrl.sendMessage(params,
+        _dartSideMethodSetClientName);
   }
-
-  String get serviceName => DartSide.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
+  void ping() {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _DartSidePingParams();
+    ctrl.sendMessage(params,
+        _dartSideMethodPingName);
   }
-
-  String toString() {
-    return "DartSideProxy($impl)";
+  void echo(int numIterations, EchoArgs arg) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _DartSideEchoParams();
+    params.numIterations = numIterations;
+    params.arg = arg;
+    ctrl.sendMessage(params,
+        _dartSideMethodEchoName);
   }
 }
 
@@ -1371,7 +1302,7 @@
   // serializedRuntimeTypeInfo contains the bytes of the Mojo serialization of
   // a mojom_types.RuntimeTypeInfo struct describing the Mojom types in this
   // file. The string contains the base64 encoding of the gzip-compressed bytes.
-  var serializedRuntimeTypeInfo = "H4sIAAAJbogC/9yaz2/bNhTHJdlObMdOnMTNvK3rPKDFsmKN0x8ojJ08dBkyrBiMtSjak6vGrK3Blj1JHrJbjjvu2D9lf8L+hByz2467FNitJdtHh6VJmRIs0YmAB1oxY/H74ePT45NqxvujAu0+tPzfaZvnWr7fKbS72LLY6nDegvY5tCfQXsd2FdvjZ+2Dzo8Hz77p2l7QCUado/F478F4/MjpItLvBrbPZP2+w5+hY2i/g6P+6Fuv5+Pvv8L2xbx+Dx0/gHEegh6iM4Otyeh+d752fm4SnTsfnv9185yLwXChx3/ceYs7p/NCr/sGjkNDfGxgW8VGEX6KP29jk+CdmUfCsYjtCbafsDX6oyFqeJPuaOi4yGsMR7+MGr539P4D+dXGxHWCAPmB30DDF6jbRV6HnOLO7EVJ/+Hs9eqMPxHOzScPc2/OXueMf17nTGy8P+1awCULXFbEfM84LuR3w/jy/fYlfDexFbA9CrC2x2jqJ7yuL7FZCXKsc9c949p5OqkfNSU6PwatU523PPTrRK6XHknpzRsfris+DhlcfJrnD+98TIUT7meG+EMVW4nEEzzy7x3X8fuoK+Jz84L7w1XQyupkXeKi+wOJN6qcLAV/aDtu72fkj0euj0R8bl0Sf2B1XiZ/MCP4Q0bBH0hqEeYPe5r8oW0t1h9YnTr9gfeDFpdHke/JBP9rqB0qfFi/4o8S5DEDR8xjDxgmPf+GJP9i/ZRNgaPmy2Hrz2Sum1Y+XIGx0K0C9VPJNmJmXm5ryoersL+g3Czm+wwzzhPodJxTvM9F9Oe5eTAKHgwc5Mrywjua4lrLWnAeTHVqzoOXLa7R/eYR7ClF81/VENdqkv2wat0hbhw75fOICJxNhfsHybdEfnc35XV2yrWq60wlb77IeSQ//1YEPpbC/JNbrojLPU3zf5hZ7PwTfTrnvwYcp/VPUx5nDYi1i4yzMj5XsJWxuZPhD3joduDgDFviB+UE+US93+RjcAiLg2uQ/9hez5Ctgxsa7zc036SpsWpdOizeWMw5vw5pvrxbXWy+TIcmypeZYc/wL8D9Nin+r/BvbmH7E673B6zPEwi0xxCPxlAf7sMCfQ514qersO8F0O0CtEVooZ7fLkFbhnYd/n8DrguCX22Gx4eVlPeXvnP/nmheijCvacaFsPi46Lhwrv/uHZH+NU36syHjjarfUtJ/+75If0mT/oxkvOsx9GcU7gu+0xTeF8oJxyWZ/mJInI2qP6sw/xPJ+l+H2Jy2/oJkvLUY+nNK+sXrf0OT/nxIvTSq/hUl/eL1X9GkfzWkbhBV/6rC+p9I1v+mpvhnScZbj6E/r1CPezkY2UHnN3sgqU9tLRmH6zE4FJQ5OO5LCYftJeOwG4NDUZmDa7sSDlVNHEzJuPdjcFgL4bAF9+DuaPJigM4XBs/hiqb4KOPQjMGhpM5hujB4DjtLxqEVg0NZncN0YfAcPtLAwQypoxzG4LCukC+49lD43KuW8HOviqQ+zvKwBM8D6dGOwWND4Tm9H3iO2+vYnmf/LuJCnwclXV8yYcx8XUi2b2C5ZUO4fR2DWyWE2w7sLYbI9+0e6vRttztAs9w+AZZp+JMZg8vTGFw2Q7hsQ07atQN7CkXgT+T9zGspcbHm1BlJbOxL6oz/Q/v3nHp/i6szthXq/ewrBHW4puw1A57ftYT39fzzgLG5XO+TuOhY+Jzkc/icRpxK8n0S3c8bKGcnQEMR5zr0SZtzWs8b3gYAAP//ZmL1wygwAAA=";
+  var serializedRuntimeTypeInfo = "H4sIAAAJbogC/9yaPWzbRhTHSUqyJVmy5a9EbdNUBRLULWrT+UAgdFKRunDRDEYTFPGkMNJFYiGRKkkVaaeMHTtmzNgxY8eOGTtmTLeMWQJkc++qR/l8vjudCIU6iMDD6cxLeO/H/717d8eqMboqUO5Dyf49LvNMybZ7CeUOtiy2GtQbUD6A8gmUV7Bdwnbv+Oig+f3B8VdtJ4iakd9sDQZ7tweDu24bkXZXsX0savcN/g0Npe0OWl3/66AT4vufY/t0Urs7bhhBPw/BH+JnBlud8pvUX66c1k1szy6ere/snnIxKC7jyzxbbTC34/cSP/cErkODf61hW8YWI/wI/97EJsB77j0SjkVsDrZjbPYwDOye33J6dsf3Oz1kd/0+sn8LHLvv/+TbYdAa/SAPsIeeG0UojEIb9R+idhsFTVJFgU0/n7TvC3RUo/5OuNd/vJM7efU2Z/z7NmdiY/V1aI3KQXZUPl3i837DcCL/r4w3225fwHsdWwHb3Qg7eA+NdcP69Rk2K0WuNaYfb5hykt+xzuoCvz8A38d+7wbo56HY//hKy/+8cXYcsnHLYNpN0sv/GlThhtuZEr1sYSuR+IO7/63ruWEXtXm8vlgwvVwC32m/acksml5IvFLlZino5cj1Oj+gcOB7IeLx2l1QvdB+L7JezCn0klHQC0llZHrZ00QvA2u2eqH91kkvrE4aTF5H7hMBvDPULhVetO7YqwR5VM/l89kDpmnrwxDkg7Su6RR92nxeNl5N6rlp5esV6Eu8lIl1LFjmnHtP1zTJ17dgPRQjsqj7GerfPYdGL3KK8+iUep+Yp6Pods9FnihPva5JXHxgzThPj/3WLE/XLS7G6+cWrJF5+tjSIC5WBet91X2VpHHwtSAcqnA3FeYjku/xdHljzuPyNVOqjkuVvH6R8lpWH9YUvCwFfZApncfppib6eJyZrT6Ivzrpowqcx/O/KY7bBsTuWcZtEa9tbGVs3rD/He6/E7l4BSDQSTlFXtPOZ/kEXGRxdQXyLyfoGKJxc1Wj+SzOh+PUXXVfXxavLKrOjtt4Aru/Pdt8Pu4aL5+nun3ufRRgPk/rfTzFtoHtj7gOPJ5B4P4T4tlz2F//Cwb037DP/mJ5VP4D4F8VII8tUoGb+FcG/qvAdQ3278Hx39fheRvyeLKU8vo4dG/d5L2nIrznecYRWXyddRw55XHjOo/HiiY8spL+T8vDUuJx7RaPR0kTHhlB/1cT8MgozDOhW+fOM+WU45qIR1ESt6flkVXQx1AQP1Yh1s+bR0HQ/2oCHjklHvz4saYJj7xkf3laHktKPPjxo6IJj2XJPsm0PJYV4sdQED/WNYmnlqD/tQQ88gr7lY96vhM1f3F6gv26Dc25XEnApaDMxfUeCbhsas5lJwGXojIXz/EEXLY04WIK/NhPwGVFwmUD5vy2P3zYQ6cDieWyrUm8FXGpJ+BSUucyHkgslwuac2kk4FJW5zIeSCyXixpwMSX7SIcJuKwq5Cue0+eeQ1ZTPoesCM4faD6WRDhHCfisKXx3EUaB63WaThA4v/I4xedxae+3meADu08mWvfQHLMSjl8m4FiRcLwAa6M+CkOng5pdx2v30HmOHwLbeejNTMDpfgJO6xJOm5Azt53IGUPi6I18/3t5TpysCfuyJNZ2BfuyeeD4bsJ5SoPZlz1SOE+hPwmpwTNFn42wPC+nvI/Bnrc8MfX6fshDj7nnUp/A73nEuff5/dC8z3Ni7m6E+qLvcUoacE/rPOe/AAAA//9qGb5tyDIAAA==";
 
   // Deserialize RuntimeTypeInfo
   var bytes = BASE64.decode(serializedRuntimeTypeInfo);
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 0c962c5..bd716d0 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
@@ -361,24 +361,22 @@
 }
 
 
-class _ImportedInterfaceProxyImpl extends bindings.Proxy {
-  _ImportedInterfaceProxyImpl.fromEndpoint(
+class _ImportedInterfaceProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _ImportedInterfaceProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _ImportedInterfaceProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _ImportedInterfaceProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _ImportedInterfaceProxyImpl.unbound() : super.unbound();
-
-  static _ImportedInterfaceProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _ImportedInterfaceProxyImpl"));
-    return new _ImportedInterfaceProxyImpl.fromEndpoint(endpoint);
-  }
+  _ImportedInterfaceProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _ImportedInterfaceServiceDescription();
+      new _ImportedInterfaceServiceDescription();
 
+  String get serviceName => ImportedInterface.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -388,50 +386,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_ImportedInterfaceProxyImpl($superString)";
+    return "_ImportedInterfaceProxyControl($superString)";
   }
 }
 
 
-class _ImportedInterfaceProxyCalls implements ImportedInterface {
-  _ImportedInterfaceProxyImpl _proxyImpl;
-
-  _ImportedInterfaceProxyCalls(this._proxyImpl);
-    void doSomething() {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _ImportedInterfaceDoSomethingParams();
-      _proxyImpl.sendMessage(params, _importedInterfaceMethodDoSomethingName);
-    }
-}
-
-
-class ImportedInterfaceProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  ImportedInterface ptr;
-
-  ImportedInterfaceProxy(_ImportedInterfaceProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _ImportedInterfaceProxyCalls(proxyImpl);
-
+class ImportedInterfaceProxy extends bindings.Proxy
+                              implements ImportedInterface {
   ImportedInterfaceProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _ImportedInterfaceProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _ImportedInterfaceProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _ImportedInterfaceProxyControl.fromEndpoint(endpoint));
 
-  ImportedInterfaceProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _ImportedInterfaceProxyImpl.fromHandle(handle) {
-    ptr = new _ImportedInterfaceProxyCalls(impl);
-  }
+  ImportedInterfaceProxy.fromHandle(core.MojoHandle handle)
+      : super(new _ImportedInterfaceProxyControl.fromHandle(handle));
 
-  ImportedInterfaceProxy.unbound() :
-      impl = new _ImportedInterfaceProxyImpl.unbound() {
-    ptr = new _ImportedInterfaceProxyCalls(impl);
+  ImportedInterfaceProxy.unbound()
+      : super(new _ImportedInterfaceProxyControl.unbound());
+
+  static ImportedInterfaceProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ImportedInterfaceProxy"));
+    return new ImportedInterfaceProxy.fromEndpoint(endpoint);
   }
 
   factory ImportedInterfaceProxy.connectToService(
@@ -441,30 +419,15 @@
     return p;
   }
 
-  static ImportedInterfaceProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For ImportedInterfaceProxy"));
-    return new ImportedInterfaceProxy.fromEndpoint(endpoint);
-  }
 
-  String get serviceName => ImportedInterface.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "ImportedInterfaceProxy($impl)";
+  void doSomething() {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _ImportedInterfaceDoSomethingParams();
+    ctrl.sendMessage(params,
+        _importedInterfaceMethodDoSomethingName);
   }
 }
 
@@ -562,7 +525,7 @@
   // serializedRuntimeTypeInfo contains the bytes of the Mojo serialization of
   // a mojom_types.RuntimeTypeInfo struct describing the Mojom types in this
   // file. The string contains the base64 encoding of the gzip-compressed bytes.
-  var serializedRuntimeTypeInfo = "H4sIAAAJbogC/8yYzW7TQBCA10kLKU2LEf1vARcKBBBxjxWnViUiERWK2hxSLv2LIUb1D7YjwRvwGDwKj9Mjx95gHc9ie7yb2ChxutJoY+84u/PtzHi8KyRoMvTb0OP7rC+hHusRKfyfaSoVuF2H3ob+B/Q/oX9G5SGV1nGzdvK+dvxGN2zL8bROdc+0vK7mHHXPbI2QV1TnCVevAT8apqc5n84utP7/PqKyzNVvWrrpDRgPJnxBxza548eaF19av7XBbhnZ7V8XqfyaCq99VNulOD97Nn5ducfnfA39Lom3bXT/D7Qm4bcFKmUq2JQHVBapCLYhsZ77YPdHKodU1K5laKrT61iGbmqOalhfLNV1LoIfdu/8Ur9QdbZVrnqumx3d/OyqnuZ6ruqeGfaldhLMXvWfMYJ5FODI5t8Ff2sWgBcJ9WJ+C3p3MnJrC7j52zLj21rbb+19eHdQg/vPwee43KqhNubn70MhB37MDxkHzAu32SG8dlL62TyVW1T2G4f7Pqwt+ntDyIlpJf1sMSdOw7iUR8RFhlzaOmz0HYPlQT4XppXksjRhLrIUvxZxqSMupwIuqxBj/KxOyGMqa1FOAkXMaQt8f9yc8LwrEb+R0P5Lkfcp5nsl4CPiSyJ8efdJJF/7sf3WOqIAvC61ibvupzn5lYI4XaE+jb1+2xHYuw42R+x97Whfe3RV/DoG2rjtLgn8YAWto0T4nH6z54vZ8tGugNMcvMeD6ijIK/PROIMBzMt/593OKa4K0bpUitu9g9Y1TdK1tPFUETw/A/v3TVAXK7CH4+aTlcPUf3CQUnD4LuCwmROHQfFU4ORlOWW+yRpHrF5OxBEM4Plnc6qjK7D3Cqqj61BHN4uD62n2EpNG9B0iqqcV2KM4t7CQxvzKOdfRUso6upDRr+op6+jEdxoqoDGfuRtSPxdHxAPXz+x7HvH4VzhjHvMT4iHDvNcj5lGGuD7YO2pF6x7Egw0neNydUL2noDgR7avonGZc5yPLwASf9iTyElLA61md0PlIHRJUe8j5CKujFjJyO82Yz1/Ct5uIWxU9gDmu5ZzfF1Lm98UxnZMkzpMwL1DEnNZvSJ5fysilnTLPs3NZIZfwqITrRxs58fkbAAD//3QI2/tgFwAA";
+  var serializedRuntimeTypeInfo = "H4sIAAAJbogC/8yYX3PSQBDAL9AqtbTi2D/0j5pq1aoj8bHjUzuVEcaOwwAP8OAUSiOJAwSTMKN+Aj9GP4ofxY/QR9/0QvYk2dxBojRwMztHckty+7vdvc1lidsy0L+CHt9nfQr1WI9Io+csUjmA2wXo+9B/h/4S+idU7lOp1kv5s3f5+mu92zdMW73IHfcMW1PNitbsq4S8oDqPuHpF+FHs2ar5sdlSh899QGWTq18y9J49Ztx94TM6tscdr6u2f2rDVgO7M8hu5zpJ5efC6NpBpaX8/H4s+68v74znfET8ja0fu/8bWonw2xqVNBVsyj0q61QEyxCYz12w2xn7QEUZWKbSMVrNjtI2jHZHVTSjqyrfzKbSNT4ZimW23B/9wXlHbyk6WzVLOdd7F3qvbSm2atmWYjW7/Y565k4k5/ynS58vA082jwLwaCTcnvmdjP0Y9G6RaPxqAn7O8ixRKedPqsfv357m4f5T8D0uv9xIG3N01iMRI0fml4wH5obb8gRuhyH9bpXKDSonxfKJA22f/t4V8mJaQb9bj5nXJD7pKfHJQI6tlotDR2H5kc+HaQX5bMwJn6zkvxbxKSA+DQGfLYg9ftYn5CGVbS8vgSLmtQ+xEBcv/P6sx48k5A+SZ9/FnK8EnESciYcz7z7x5HUn5t8YFWq3rVGDuNwex+xnMuJ1hfowdjvtUGD3DtjusfulqX4e0Cnx92NocdmfEvhFFs0nhfyEjf9ifpSMlq+OBLxWYP93qyo376x64w8GMDdnj7wZc7wlvPGG6qhDNL9FEq6FjbMDwf+XYB2/COpqGdYyLk5ReSz8Aw8pBI+vAh57MfMYF2cJTv7OhMxHUeOL1d+B+IIB/P7lmOvyA/AFGdXlNajLteT4+jwl+T5v/vv7RlSfy7BWfn6jwhxzTM+oLpdC1uWJiH5WCFmXB74DUUGOOa3MWT2enBIXXI+zcwPE5W8hjrmszphLhvmINF0uaYj30+NK1Vs3IS5sOMDl9ozrRhnFj2idRedD13Uuswls8ClTIG8hBTyfrRmfy5SAhzbhXIbVYWsR834jYt5/Dt+GIn459AfMc3tG+8BayH1g/ZrOZwLnWZgbKGJeO3O2H2xE5FMLuR+wc2Ihn9ERDdevdmPm9CcAAP//jmet5PgXAAA=";
 
   // Deserialize RuntimeTypeInfo
   var bytes = BASE64.decode(serializedRuntimeTypeInfo);
diff --git a/mojo/dart/packages/_mojo_for_test_only/lib/imported/sample_import2.mojom.dart b/mojo/dart/packages/_mojo_for_test_only/lib/imported/sample_import2.mojom.dart
index cb39b5d..0f2307c 100644
--- a/mojo/dart/packages/_mojo_for_test_only/lib/imported/sample_import2.mojom.dart
+++ b/mojo/dart/packages/_mojo_for_test_only/lib/imported/sample_import2.mojom.dart
@@ -288,7 +288,7 @@
   // serializedRuntimeTypeInfo contains the bytes of the Mojo serialization of
   // a mojom_types.RuntimeTypeInfo struct describing the Mojom types in this
   // file. The string contains the base64 encoding of the gzip-compressed bytes.
-  var serializedRuntimeTypeInfo = "H4sIAAAJbogC/8yXzW7TQBCA101CgwolQKGhIMixp7jiFHGihIhIrVBFcqk4VKmz1Itib2S7QuIJ+gg8HsceeQNYZ2fAGXvtNEpMVxpNnbV3d77Z+WmT6dEAfQCa/o66TjR97wp0S0klMY/r9kG/UrKrZHh60js76p2+Ed5UBhEft7tyIgP2Us09zZwfiO887/uhK/wL1oH98Vz7iXNa8Tkq889Xd7LtuQb9ls0PtKcD+jcM+h6O+0pqSrR12rZtJcTs1P743WclAyW2Kz1uB5dj6QmfB7Ynv0o7DBz9x/TyfCIcW/gRD76MHB7a58IfKx6hHfEwCu1w5E0n/Ezv+rodf+T9tXsjsW/TmufWYvljUT59w/db4K9Pvfez5z0lj1J82jid4rQN5183pyIe1op4oN/fHR92j5R+oWQnzQOnUzwelMSjRfLALzxHZTVxc09JNbZhFvWMPQE2JB2k7I/vzuZ/iJuGNW93h5yrxhYbJm4swS15H03355sYR24Gn8eQw9fN56YcqktwsHI4xHkhTu0uFxdulOawUxIHrDO0bjJyf0zx1N9cbR3SVTKjDsEE5bRbUjztwx1ADj8hnn5APrmumuOrlsw/OG+tN75CdzTNyj/x88MS8y8j++PvKf8O9IHN/ZN+oQH3sm64l5RLbOvdWf3uDg8/fjjuFfZ5ep9F/XhgrSc/oB8d6MuoH5+VlB9Mfmwa+sei/nlR/1mJerCF6/9rKwr3KfIfHfUl/LeR478GrDmRzigS0qf+27tl/juRavFcrvqNm3JtLMG1ksMV+64Q+i7K9XlJ9aCIK+0Pi/5vzKvDybrzJwAA//8GIg9dGA8AAA==";
+  var serializedRuntimeTypeInfo = "H4sIAAAJbogC/8yXy27TTBSAx3XzN78KJUChoSDIsqsMYhWxagkRlVqhimbTDcV1pvEgO2N5XCH1CXgUHoFHYsmSHYw7Z4R9fEuj1GWko1Nn7Ll859ou0aMD+iVo/LvRbaTxe19B95TYqXmz7j7oF0q2lIxPjkanB6OT1zwIRRSzSX8ofBGR52ruceH8Mb9kVd+PPT6bkgHsb861kzqnpeSTnX3+/l/xfX6C3iXZYe4zAP0bBn7PjLtKWkr07fTdNpSga+f2N9+dK/mohF7IiPrCdXw6FWLqM+qJgNHLyKGB+CyojFz9R3hx5nOX8lnMonPHZZKe8dlEoZE0ZjKWVDpB6LNTfYBX/eSjQO+/ktq/Z2X59Uj1mJfTfsn362C3D6O3V8/bSh7kOPXNdI7XBpy/KV51XKwlcTF+8OZwb3ig9DMlm3kuZjrH5V7DXHooP/wycWgvJ57uKFlVorMBIY+AEUoTOQ6JL63dYjx1rez9B+h8LTLfKONHUvzScVvmT1/4JPYKOD2EHN8Up+vyWF2Ah1XBI8kbSQnwGJ96cZ7HZsM8TF3CdZbg/FwSZ+HacuuWrqoFdQsmMK+thuNsB3zC8PgBcfbNzjpSkZ+1UtzM+Xetm4076TlhUX5Knu/fQp4m6Bzm95y9j/XBy/sv/UIH/LRd4qeYT3Ln/6/q/nC89/7d4ai2T9T7zGvPgXUzecPY04W+DtvzScN5o8ye3ZI+tK4Pn9eOVqpurJv1/7YjtfvU2RGP9gJ2XKmwYwfWTEwTczHDdtz+R+14JNTKlXz1G9fl21mAr13B1/RrEvo1zPdpw/Wiji/uL+v+H62q1+m69CcAAP//myQ+J3APAAA=";
 
   // Deserialize RuntimeTypeInfo
   var bytes = BASE64.decode(serializedRuntimeTypeInfo);
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 9546dd4..5e3f3cd 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
@@ -455,24 +455,22 @@
 }
 
 
-class _CalculatorProxyImpl extends bindings.Proxy {
-  _CalculatorProxyImpl.fromEndpoint(
+class _CalculatorProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _CalculatorProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _CalculatorProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _CalculatorProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _CalculatorProxyImpl.unbound() : super.unbound();
-
-  static _CalculatorProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _CalculatorProxyImpl"));
-    return new _CalculatorProxyImpl.fromEndpoint(endpoint);
-  }
+  _CalculatorProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _CalculatorServiceDescription();
+      new _CalculatorServiceDescription();
 
+  String get serviceName => Calculator.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _calculatorMethodClearName:
@@ -542,68 +540,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_CalculatorProxyImpl($superString)";
+    return "_CalculatorProxyControl($superString)";
   }
 }
 
 
-class _CalculatorProxyCalls implements Calculator {
-  _CalculatorProxyImpl _proxyImpl;
-
-  _CalculatorProxyCalls(this._proxyImpl);
-    dynamic clear([Function responseFactory = null]) {
-      var params = new _CalculatorClearParams();
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _calculatorMethodClearName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    dynamic add(double value,[Function responseFactory = null]) {
-      var params = new _CalculatorAddParams();
-      params.value = value;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _calculatorMethodAddName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    dynamic multiply(double value,[Function responseFactory = null]) {
-      var params = new _CalculatorMultiplyParams();
-      params.value = value;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _calculatorMethodMultiplyName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-}
-
-
-class CalculatorProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  Calculator ptr;
-
-  CalculatorProxy(_CalculatorProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _CalculatorProxyCalls(proxyImpl);
-
+class CalculatorProxy extends bindings.Proxy
+                              implements Calculator {
   CalculatorProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _CalculatorProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _CalculatorProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _CalculatorProxyControl.fromEndpoint(endpoint));
 
-  CalculatorProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _CalculatorProxyImpl.fromHandle(handle) {
-    ptr = new _CalculatorProxyCalls(impl);
-  }
+  CalculatorProxy.fromHandle(core.MojoHandle handle)
+      : super(new _CalculatorProxyControl.fromHandle(handle));
 
-  CalculatorProxy.unbound() :
-      impl = new _CalculatorProxyImpl.unbound() {
-    ptr = new _CalculatorProxyCalls(impl);
+  CalculatorProxy.unbound()
+      : super(new _CalculatorProxyControl.unbound());
+
+  static CalculatorProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For CalculatorProxy"));
+    return new CalculatorProxy.fromEndpoint(endpoint);
   }
 
   factory CalculatorProxy.connectToService(
@@ -613,30 +573,32 @@
     return p;
   }
 
-  static CalculatorProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For CalculatorProxy"));
-    return new CalculatorProxy.fromEndpoint(endpoint);
+
+  dynamic clear([Function responseFactory = null]) {
+    var params = new _CalculatorClearParams();
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _calculatorMethodClearName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
-
-  String get serviceName => Calculator.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
+  dynamic add(double value,[Function responseFactory = null]) {
+    var params = new _CalculatorAddParams();
+    params.value = value;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _calculatorMethodAddName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
-
-  String toString() {
-    return "CalculatorProxy($impl)";
+  dynamic multiply(double value,[Function responseFactory = null]) {
+    var params = new _CalculatorMultiplyParams();
+    params.value = value;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _calculatorMethodMultiplyName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
 }
 
@@ -810,7 +772,7 @@
   // serializedRuntimeTypeInfo contains the bytes of the Mojo serialization of
   // a mojom_types.RuntimeTypeInfo struct describing the Mojom types in this
   // file. The string contains the base64 encoding of the gzip-compressed bytes.
-  var serializedRuntimeTypeInfo = "H4sIAAAJbogC/+xXTWvyQBA2+r4Q9f3w/WhNb0IvXup6lJ4sRSiUgodehILEZFtT8mHzUeg/6c/z2GOPvbWbZlbXaRYjKNqSgWGa7Q6Z5+GZJ6gVkqhBbUPF57yqqOJ7HeFZEe414O7loN8bnvcGx44ejlunum1Eth56vgb3476S0NcU+sV4Qc9d9NxG568QZ4X0+MuywnI+UXJeZ/mbJRr3A24V+q9ijCzJ2HMo8SPTcyyX+sTxbj0S+EbyxyQa2ZZBLDek/rVu0ICMLNe03JuAhDQIAxK/bmjMXteKu5w0vjkv/4G3AvBYFP5fEvr635L6WE7nd8r5VbLxi6MpOf/J8nvMr011PwVHGWbeNH8NpNspqstwch3J8O8B1necRz69i9g8KXh5bBqvKtlHDc2hIh1gfp6V9fCzz/KXwE8w8dyAbo8fzEs3xcf4TmWJde3JvW5HVLIn9S3wIupFEeaR+YdaWuRtGS8KpIyXKvjYiWmmfncqW/aPde3HP8DKcAruke9H1v2owPd6V/Zj03qJv/s/ZnrhbprrZRW9HH4iPy1m5KUIKeOlBrNcRHZoTewHzEv1i/ipBpg4Tm6q+X5k248qeMyu+ukT+r2SVS8dCR8HLP8s6mVuqrmvrqSb5g7p5i0AAP//5ns7IOgQAAA=";
+  var serializedRuntimeTypeInfo = "H4sIAAAJbogC/+xXTY/TMBBtU5CyLR/lc8OtEpdeWO9xxWkRWgkJIXHgsqfKm5pskBOHOEGCX8uxR/4BOGTcOtOYflDasMpIo2kcW5n3+ual9TplDKGeQsXrurqo4n1nxnXX2DeCvR8u319M3l5cvoxodn3ymnI/5zQTqQf7i3M949zYOF+JbvXyHN0+Res/Id506uOhyr7KRUfl+rHK+ypRu0u4XTgfqJyoJLlMCRc+5SQQIuCMXIuIkW8pJZH4JIhM/fJDkl/x0CdhnLH0I/WZJFdhPA3jQJKMyUyS4skTf/7kk+JUtPR8zc9j4E9T5Bj3e8b3ldwq6/ejep5nGpezHs84xpb1uypvFzxzRtMa/RxBz/vicYR0PEN1FV6tKxsPTwDzb7wvUvY5V83U4NaxL9yuZU491I+LdIF50gL7W56eqrxn8CQTEUt2eJ4wP+c1PldjR9bY1fx8oTxnlvk5PiA/HrLoYefP/jLqVflbxU8X0sbPAHzu1XRa+37qN8RfdjU3jwCzwmu4Szs3m85NH97zTZubf62f4vfCnbl+tOu2+tlGP8//Q9911uTHgbTxM4Re3uU8CxP+FfMzuGG+6wE2jVebbzs3m83NADyo6b77A/0fWlc/ZxZenql8UNXPwnxb/91KR+MG6uhXAAAA//+Vb42mYBEAAA==";
 
   // Deserialize RuntimeTypeInfo
   var bytes = BASE64.decode(serializedRuntimeTypeInfo);
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 6689a76..8c57cab 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
@@ -180,24 +180,22 @@
 }
 
 
-class _EchoProxyImpl extends bindings.Proxy {
-  _EchoProxyImpl.fromEndpoint(
+class _EchoProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _EchoProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _EchoProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _EchoProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _EchoProxyImpl.unbound() : super.unbound();
-
-  static _EchoProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _EchoProxyImpl"));
-    return new _EchoProxyImpl.fromEndpoint(endpoint);
-  }
+  _EchoProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _EchoServiceDescription();
+      new _EchoServiceDescription();
 
+  String get serviceName => Echo.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _echoMethodEchoStringName:
@@ -227,51 +225,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_EchoProxyImpl($superString)";
+    return "_EchoProxyControl($superString)";
   }
 }
 
 
-class _EchoProxyCalls implements Echo {
-  _EchoProxyImpl _proxyImpl;
-
-  _EchoProxyCalls(this._proxyImpl);
-    dynamic echoString(String value,[Function responseFactory = null]) {
-      var params = new _EchoEchoStringParams();
-      params.value = value;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _echoMethodEchoStringName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-}
-
-
-class EchoProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  Echo ptr;
-
-  EchoProxy(_EchoProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _EchoProxyCalls(proxyImpl);
-
+class EchoProxy extends bindings.Proxy
+                              implements Echo {
   EchoProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _EchoProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _EchoProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _EchoProxyControl.fromEndpoint(endpoint));
 
-  EchoProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _EchoProxyImpl.fromHandle(handle) {
-    ptr = new _EchoProxyCalls(impl);
-  }
+  EchoProxy.fromHandle(core.MojoHandle handle)
+      : super(new _EchoProxyControl.fromHandle(handle));
 
-  EchoProxy.unbound() :
-      impl = new _EchoProxyImpl.unbound() {
-    ptr = new _EchoProxyCalls(impl);
+  EchoProxy.unbound()
+      : super(new _EchoProxyControl.unbound());
+
+  static EchoProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For EchoProxy"));
+    return new EchoProxy.fromEndpoint(endpoint);
   }
 
   factory EchoProxy.connectToService(
@@ -281,30 +258,15 @@
     return p;
   }
 
-  static EchoProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For EchoProxy"));
-    return new EchoProxy.fromEndpoint(endpoint);
-  }
 
-  String get serviceName => Echo.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "EchoProxy($impl)";
+  dynamic echoString(String value,[Function responseFactory = null]) {
+    var params = new _EchoEchoStringParams();
+    params.value = value;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _echoMethodEchoStringName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
 }
 
@@ -426,7 +388,7 @@
   // serializedRuntimeTypeInfo contains the bytes of the Mojo serialization of
   // a mojom_types.RuntimeTypeInfo struct describing the Mojom types in this
   // file. The string contains the base64 encoding of the gzip-compressed bytes.
-  var serializedRuntimeTypeInfo = "H4sIAAAJbogC/5JggAABKN0BpdHFLZD4jEDMAeXLALEIEOfmZ+VbWaVWJOYW5KQWW1m5JmfkY1OvDMTSQBwSGeAa7+0aaQXSqAfTpwfThmG/Aw77STGPEaqfGUm/BpRWgNIejBA6AUozoNkPC4cZUHoBlP4PBRsYsAN0dytgCWd2JHFhIOYG4uDUorLM5FS/xNxUosKbB4hZgBjGlwJiIah6LMGCEc6cQMwFxJZAbAjE+hn5uan6RaUp+bmZealF+iBz9IuLkvVhZumnAs0CE3oguVwi0wW6vTA+DzSccIUbenydgNFM2OMLBgzQ+KC4wiYOA0LQcAC5N7ikKDMvHXt4gdQwUSG80NMD3F+MxPsHBCxw+AeWDhD+0S1KLSxNLS7B7i8YoNRf6PHngKM8ucBAHCA2XjVw6OcFYlYgLkvMKU3FEZ+iVPI3A1JaRg8HCSQ3MSKpp3U6kIaWLSjpoLggP684dTQdoKUDjQFMB4AAAAD//1YHjLGYBwAA";
+  var serializedRuntimeTypeInfo = "H4sIAAAJbogC/5JggAABKN0BpdHFLZD4jEDMAeXLALEIEOfmZ+VbWaVWJOYW5KQWW1m5JmfkY1OvDMTSQBwSGeAa7+0aaQXSqAfTpwfThmG/Aw77STGPEaqfGUm/BpRWgNIBjBA6A0ozoNkPC4cZUHoBlP4PBRsYsAN0dytgCWd2JHFhIOYG4uDUorLM5FS/xNxUosKbB4hZgBjGlwJiIah6LMGCEc6cQMwFxC5AbAPE+qXFRfo5+cmJOfrp+fnpOan6Gfm5qfpVRYn6ICP1i4uS9WHG6qcCjQUTeiC5XGLci24/jM8DDS9c4Ycebxeg9AMm7PEGAwZofFCcYROHASFoeIDcG1xSlJmXjj3cQGqYqBhu6OkD5r8bjMT7CwQscPgLli4Q/tItSi0sTS0uwe4/GKCW/9Dj0wFHOXODgThAbDxr4NDPC8SsQFyWmFOaiiN+RansfwakNI4eHhJIbmNEUk/rdCENLXtQ0kVxQX5ecepousCRLjQGQboABAAA///YBJ9/yAcAAA==";
 
   // Deserialize RuntimeTypeInfo
   var bytes = BASE64.decode(serializedRuntimeTypeInfo);
diff --git a/mojo/dart/packages/_mojo_for_test_only/lib/mojo/test/rect.mojom.dart b/mojo/dart/packages/_mojo_for_test_only/lib/mojo/test/rect.mojom.dart
index a6111e7..d432bee 100644
--- a/mojo/dart/packages/_mojo_for_test_only/lib/mojo/test/rect.mojom.dart
+++ b/mojo/dart/packages/_mojo_for_test_only/lib/mojo/test/rect.mojom.dart
@@ -139,7 +139,7 @@
   // serializedRuntimeTypeInfo contains the bytes of the Mojo serialization of
   // a mojom_types.RuntimeTypeInfo struct describing the Mojom types in this
   // file. The string contains the base64 encoding of the gzip-compressed bytes.
-  var serializedRuntimeTypeInfo = "H4sIAAAJbogC/5JggAABKG0ApdHFYTQHGo2uzgKJz4ikTh6IxYE4JDLANd7bNdIqNz8rX68ktbhELyg1uQRsDiMWfQpo9ryA2c8KoR0YUIEBmjv+QwG6OhjgAWIWIAY7AgjEgJgPiNGch+FPkPvYgTgQiD2BWD8jPzdVv6g0JT83My+1SB+kX7+4KBnCKChNyslM1s/MK0ktSktMTi3WT8rMS8nMSy/WB9lRrF8EtEQPpDQXar4G1F1w/zNC7WeC2s+M6n8LNPexMhAHcIUfA1L4wdyDDXBC46sCR3rghIYVrcKJVP+zkOF/RiL8X4nD/1yDzP8cZPifCY//eaF2lWemlGRg8T/3IPM/Dxn+Z8bjf1BZwQbEGamZ6RlYygkeGvsfvbyUQEvrMD4gAAD///PaA+DoBQAA";
+  var serializedRuntimeTypeInfo = "H4sIAAAJbogC/5JggAABKG0ApdHFYTQHGo2uzgKJz4ikTh6IxYE4JDLANd7bNdIqNz8rX68ktbhELyg1uQRsDiMWfQpo9nyAuZMVQjswoAIDNHf8hwJ0dTDAA8QsQAx2BBCIATEfEKM5D8OfIPexA3EMyE9ArF9aXKSfk5+cmKOfnp+fnpOqn5Gfm6pfVZSoDzJKv7goGcIoKE3KyUzWz8wrSS1KS0xOLdZPysxLycxLL9YHWVesXwS0Tw+kNBdkjwbUfbBwUGCE0kxQmhk1HCzQ3MnKQBzAFY4MSOEIcw82wAmNtwoc6YITGma0Di9Sw4GFjHBgJCIcKnGEA9cgDQcOMsKBCU848ELtKs9MKcnAEg7cgzQceMgIB2Y84QAqS9iAOCM1Mz0DSznCQ6dwQC9XJdDyAIwPCAAA//9Y6fq5EAYAAA==";
 
   // Deserialize RuntimeTypeInfo
   var bytes = BASE64.decode(serializedRuntimeTypeInfo);
diff --git a/mojo/dart/packages/_mojo_for_test_only/lib/mojo/test/serialization_test_structs.mojom.dart b/mojo/dart/packages/_mojo_for_test_only/lib/mojo/test/serialization_test_structs.mojom.dart
index c6c0948..8ece68d 100644
--- a/mojo/dart/packages/_mojo_for_test_only/lib/mojo/test/serialization_test_structs.mojom.dart
+++ b/mojo/dart/packages/_mojo_for_test_only/lib/mojo/test/serialization_test_structs.mojom.dart
@@ -588,7 +588,7 @@
   // serializedRuntimeTypeInfo contains the bytes of the Mojo serialization of
   // a mojom_types.RuntimeTypeInfo struct describing the Mojom types in this
   // file. The string contains the base64 encoding of the gzip-compressed bytes.
-  var serializedRuntimeTypeInfo = "H4sIAAAJbogC/+yYzW7TQBDHbbdV3NKqQQLJ5UMKLYccUNzmSxUnLpUqIQESHOjJOInbLHLsyOtIiBOPwJFH4MiRR+mjcIPdeqyuF0/kxvgDwUqj8Vpje/yfn2c3MZRoNMEfgpfPx16XvBw3VSP/jFmD2TGcfwv+A/gv4L+DvwT/A/w+s3vM3py9OrGen5w9nfnv/U7o0LDzOgwW4/AoY1w3Y1wvY1w/Y9wgY9wwinvC7PGyuJfnLxaua49ch8Y6NkB3LvlUqAOff9OSc30jOf/aSM6nW8l5eyc5/7QbzVtS3RWot6Fd110cMU8xBz9hnCrpYxfeKy7yHju+zQwp/2/86XD9BTOLmTn1Z44ZLCb+jHhOYPL7mDQYRwfzxcglY5N4oROc22OHmiPiTYh3QU3+LGpSJyC2Sz7aIfE9i5+z6NXzaYffYHatr5J8/2Mpr4aSbWD6KYJ+3LeR6zchH4Loswm5VqWPIeSqCnlhXLUL4aqLctVFdNuuIVfrQr8smqtbzNZ4n5i4qfrsAFtl6iOOvJzNC+Gsh3LWW7LO1o2zjRI5a0IuUZbWkawP13KrRH1aKfmJdZPXq6z7lry8fi6E1z7Kax/h9U4NedVK5HUb+vDEDu00fe6CnlXwynOPv19d4unf4HmA8jxAeDb+83zF89wmQZo+e/DNV8GzJqxHdee5mH3rEOV5iPD8oIY8qxXsW1mWqfo8/Ev3rQZwdrm+XKdTibN3iE4xV6l/NrBxwOx+CndypKxvq2T+WlDvOI9DZH2p6++oRyXvb5vJtnXj/b++gj5qjv3/PmhY9vqj/uH15aZ9sbmCzlqOvnhQMYfL+uKa0A9/BQAA//9CnCj5wBYAAA==";
+  var serializedRuntimeTypeInfo = "H4sIAAAJbogC/+yYzW7TQBDH7ZQobmlFkEBK+ZBCy6EHlKX5UsQpl0qRkAAJDvQUNo6bbLWJK68joT4FRx6DI4/AkSOPwCNwg108hvWyG5mExA4w0mi8ztgZ/+eX3XUqVmRliA8hqufj6ChRzRvbUexyL3HvwPmXEF9DfAvxPcRPEL9APOB+i/uL02cn/ccnp48m/rlfCz0W1p6HwcwNj1Pm1VPmNVLmNVPmtVLmtaO8B9zvz8t7evZkRikeUI/FOpZAdyH5WOqDGH8sJMe9YnLsOMnx553k+MNectyFBlfVvkO/O4WffZct5inm4CtYz9LbNXiuuMn7/Pg6d0P7f+HPgesD7ufc0YwFiPoupmjk+yPqobE/8dBlgJG4JWKBGx1czAaUuIhMQy84w67H0IBMh2Q6Ykh8LUPMCwim5BKHxJ/2xbk++14Kq4kbTBR9raQeHaXOkpXOTHpakp4iHhmu34Z6iEGvbag1L3pVpNptqU4Td72VcFc3clc36Li7AdxdEZ/b6+HuKvctMS8NqVavPWAvS71kW5bDNyvhsGHksDFnnc47h8U1cliGWqJS+8eqXkLbnQz1qmrqlfuqrodp90XL8vxuJTw3jTw3DTzf2ACeC2vkeRfm8SEOsU6vm6BvHngWz/Lj9279i7y3jLy3DLxX/vOu5f0Ck0Cn1z7MEXngvSCvbznnfTX75raR97aB9zsbwLudwb6Zl6rV6+5fsm8+Aj0rxfm69RQOXxl0i7nT/lnC7ZD7bQ2XaqaqdzVjPqvAQ1xX17Be5fU9717G++uyxOIi7yPOAnrZS7yPHICmWa9n9h9er353Xi0voHthiXn1MGeczptXt6Q+fQsAAP//9zy6HcAXAAA=";
 
   // Deserialize RuntimeTypeInfo
   var bytes = BASE64.decode(serializedRuntimeTypeInfo);
diff --git a/mojo/dart/packages/_mojo_for_test_only/lib/mojo/test/test_enums.mojom.dart b/mojo/dart/packages/_mojo_for_test_only/lib/mojo/test/test_enums.mojom.dart
index ae7a3c6..b4a94b9 100644
--- a/mojo/dart/packages/_mojo_for_test_only/lib/mojo/test/test_enums.mojom.dart
+++ b/mojo/dart/packages/_mojo_for_test_only/lib/mojo/test/test_enums.mojom.dart
@@ -157,7 +157,7 @@
   // serializedRuntimeTypeInfo contains the bytes of the Mojo serialization of
   // a mojom_types.RuntimeTypeInfo struct describing the Mojom types in this
   // file. The string contains the base64 encoding of the gzip-compressed bytes.
-  var serializedRuntimeTypeInfo = "H4sIAAAJbogC/+SVTU/yQBDHoYXnUUGD78bXJnrg1BJOxhOa1Jh4gGiD4UQEqtbYlrTwHfyoHvkGOrudJjLuAomlHpjk32mXYXf21+nsXiayEvoKejoe+yXiaVz/27gimPcUdACyWg2zfWu2Llz/1dcHdjjQLbiY3tDlcWegw8lxVRZXJuvQfN7z4vEP9LXMuMV5nqP/RLvJiK2ELOKk9uF+AyTZ1o88VBBL8QFUBxkvvmsbwbDnu45nBwabxwiDbnTTH3benK7heAM7eHrs2qHRcbye4z2HBlsrurZtWC3U2R9czicH0uL9ZXHfSuQbauTL+LtG8huR/f6WVxHzscx7iz2fgHaFvHQeQnnl8H3Pi1cJ30ls07hkE+KyjHM18ZnV/paYS1NUR/mUuGRn5KIkxKWA617X6/z5GLQj5sJDKJd/KXFRZuSiJszl6vJuGhceQrn8T4mLKunLoykcaoRDQ8JhHb+dsUMBz5hNIY+qMJ+VlPuwhh9SBQunJunDMku6D2vIRMCLN2LKqzDn+vmrvnsE2pZwaArqprggfVd+Tld546VcVhek707iwmIol7WU++5XAAAA//9rPPmt4AsAAA==";
+  var serializedRuntimeTypeInfo = "H4sIAAAJbogC/+SWS0/CQBDH+wBfoMG38UmiB09dwsl4QpMaEw8QbUjwglAr1pSWtHDx5Mf0o3jT2XYaYd0FEht6YJJ/p7sZdmZ/3U7ZkyIroC+hZ+djv8R4Nq43NK9w1j0FHYCMRk1v3umNy6735ml9K+hrBlx0d9AN485Ah+PjyjTunMnD1vOZ5c9/oa9IoxbXeYH+G+1W4lsBWcRF7cP9BkiwrT91qCBaYhv0CCKDwCeOZ7Yc0vG8jmORV69rkXe/ReiSJPDN6KY3aDu2SWy3b/kvLdMKSNt2n223ExCaNro2LUgcaPQHmJ/yyoCK8f7lyD8pkf9Qf+Okobi4Xkke3f9/+eWxHkN/MOj4BLTL5aeFISy/DD7/WfEr4DOLbRInOSFOy7hWHcf03djic6rzzlk2JU7ylJyUhDjlMO9NtRqOj0E7fE5hCMtpISVOypSc1IQ5XV/dT+IUhrCcFlPipAr6fMxHxKXCcKkJuKzjuzbykcFv1iaXT5lbz0rKfb2EPGp4sHqCvi6ypPt6ERlx+IWNneWXm/H5SquPH4G2BVzqnHOVn9M+Lv5fUA4bOctpdU77+DhONIbltJZyH/8JAAD//6sqR8uADAAA";
 
   // Deserialize RuntimeTypeInfo
   var bytes = BASE64.decode(serializedRuntimeTypeInfo);
diff --git a/mojo/dart/packages/_mojo_for_test_only/lib/mojo/test/test_included_unions.mojom.dart b/mojo/dart/packages/_mojo_for_test_only/lib/mojo/test/test_included_unions.mojom.dart
index edb6f59..d29e13f 100644
--- a/mojo/dart/packages/_mojo_for_test_only/lib/mojo/test/test_included_unions.mojom.dart
+++ b/mojo/dart/packages/_mojo_for_test_only/lib/mojo/test/test_included_unions.mojom.dart
@@ -104,7 +104,7 @@
   // serializedRuntimeTypeInfo contains the bytes of the Mojo serialization of
   // a mojom_types.RuntimeTypeInfo struct describing the Mojom types in this
   // file. The string contains the base64 encoding of the gzip-compressed bytes.
-  var serializedRuntimeTypeInfo = "H4sIAAAJbogC/5JggAABKG0ApdHFYTQHGo2uzgGJz4ikTgOIFYA4JDLANd7bNdIqNz8rX68ktbhEzzMvOac0JTUlNC8zP08Cqg+knwmPPWBFSPYxoLkfJv4fCgIYsANRIOYFYhRHAPnyQCwOxDicieEediBmA+JEII4EYv2M/NxU/aLSlPzczLzUIn2QOfrFRckQRkFpUk5msn5mXklqUVpicmqxflJmXkpmXnqxPsguCBmfCbUxvhRkZbEeSGsunvBlgIYxsruY0fyLK7wYkMIL2Tx0wAm1NxFHvHBAw4Je4QAIAAD//8B6whbAAgAA";
+  var serializedRuntimeTypeInfo = "H4sIAAAJbogC/7yRsU/FIBDGeZroczBxMb5NR6ees5PLG4zLG3To1FDAiqFgoCz+83qk14SiOHrJr1cIx/f1647NdUH9jnq5v/Rt0ctzD9l6k527RW6Q5/aw75727f3o3l0zqTA1j1aYKJV8sdrZHc2l+aM/dLabtR4r/C/7X1QH9ntdIufIygSur5ErpGLzh59T5AQxiEQgBg/GCW5gcG4wCt7cqODTc0hXQvBifvmIvdECtJ2Uf+VCBei1ldoOAZLs/Ow0iXcxqYcmjY61nBllnfs7Lr67lhvLcsvvK+uMdHnt/1Am/53HdwAAAP//oYyvYtACAAA=";
 
   // Deserialize RuntimeTypeInfo
   var bytes = BASE64.decode(serializedRuntimeTypeInfo);
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 3b81529..e278849 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
@@ -6008,24 +6008,22 @@
 }
 
 
-class _SomeInterfaceProxyImpl extends bindings.Proxy {
-  _SomeInterfaceProxyImpl.fromEndpoint(
+class _SomeInterfaceProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _SomeInterfaceProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _SomeInterfaceProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _SomeInterfaceProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _SomeInterfaceProxyImpl.unbound() : super.unbound();
-
-  static _SomeInterfaceProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _SomeInterfaceProxyImpl"));
-    return new _SomeInterfaceProxyImpl.fromEndpoint(endpoint);
-  }
+  _SomeInterfaceProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _SomeInterfaceServiceDescription();
+      new _SomeInterfaceServiceDescription();
 
+  String get serviceName => SomeInterface.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _someInterfaceMethodSomeMethodName:
@@ -6055,51 +6053,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_SomeInterfaceProxyImpl($superString)";
+    return "_SomeInterfaceProxyControl($superString)";
   }
 }
 
 
-class _SomeInterfaceProxyCalls implements SomeInterface {
-  _SomeInterfaceProxyImpl _proxyImpl;
-
-  _SomeInterfaceProxyCalls(this._proxyImpl);
-    dynamic someMethod(RectPair pair,[Function responseFactory = null]) {
-      var params = new _SomeInterfaceSomeMethodParams();
-      params.pair = pair;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _someInterfaceMethodSomeMethodName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-}
-
-
-class SomeInterfaceProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  SomeInterface ptr;
-
-  SomeInterfaceProxy(_SomeInterfaceProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _SomeInterfaceProxyCalls(proxyImpl);
-
+class SomeInterfaceProxy extends bindings.Proxy
+                              implements SomeInterface {
   SomeInterfaceProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _SomeInterfaceProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _SomeInterfaceProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _SomeInterfaceProxyControl.fromEndpoint(endpoint));
 
-  SomeInterfaceProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _SomeInterfaceProxyImpl.fromHandle(handle) {
-    ptr = new _SomeInterfaceProxyCalls(impl);
-  }
+  SomeInterfaceProxy.fromHandle(core.MojoHandle handle)
+      : super(new _SomeInterfaceProxyControl.fromHandle(handle));
 
-  SomeInterfaceProxy.unbound() :
-      impl = new _SomeInterfaceProxyImpl.unbound() {
-    ptr = new _SomeInterfaceProxyCalls(impl);
+  SomeInterfaceProxy.unbound()
+      : super(new _SomeInterfaceProxyControl.unbound());
+
+  static SomeInterfaceProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For SomeInterfaceProxy"));
+    return new SomeInterfaceProxy.fromEndpoint(endpoint);
   }
 
   factory SomeInterfaceProxy.connectToService(
@@ -6109,30 +6086,15 @@
     return p;
   }
 
-  static SomeInterfaceProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For SomeInterfaceProxy"));
-    return new SomeInterfaceProxy.fromEndpoint(endpoint);
-  }
 
-  String get serviceName => SomeInterface.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "SomeInterfaceProxy($impl)";
+  dynamic someMethod(RectPair pair,[Function responseFactory = null]) {
+    var params = new _SomeInterfaceSomeMethodParams();
+    params.pair = pair;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _someInterfaceMethodSomeMethodName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
 }
 
@@ -6254,7 +6216,7 @@
   // serializedRuntimeTypeInfo contains the bytes of the Mojo serialization of
   // a mojom_types.RuntimeTypeInfo struct describing the Mojom types in this
   // file. The string contains the base64 encoding of the gzip-compressed bytes.
-  var serializedRuntimeTypeInfo = "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";
+  var serializedRuntimeTypeInfo = "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";
 
   // Deserialize RuntimeTypeInfo
   var bytes = BASE64.decode(serializedRuntimeTypeInfo);
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 ea6ee4c..46bf438 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
@@ -2972,24 +2972,22 @@
 }
 
 
-class _SmallCacheProxyImpl extends bindings.Proxy {
-  _SmallCacheProxyImpl.fromEndpoint(
+class _SmallCacheProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _SmallCacheProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _SmallCacheProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _SmallCacheProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _SmallCacheProxyImpl.unbound() : super.unbound();
-
-  static _SmallCacheProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _SmallCacheProxyImpl"));
-    return new _SmallCacheProxyImpl.fromEndpoint(endpoint);
-  }
+  _SmallCacheProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _SmallCacheServiceDescription();
+      new _SmallCacheServiceDescription();
 
+  String get serviceName => SmallCache.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _smallCacheMethodGetIntValueName:
@@ -3019,59 +3017,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_SmallCacheProxyImpl($superString)";
+    return "_SmallCacheProxyControl($superString)";
   }
 }
 
 
-class _SmallCacheProxyCalls implements SmallCache {
-  _SmallCacheProxyImpl _proxyImpl;
-
-  _SmallCacheProxyCalls(this._proxyImpl);
-    void setIntValue(int intValue) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _SmallCacheSetIntValueParams();
-      params.intValue = intValue;
-      _proxyImpl.sendMessage(params, _smallCacheMethodSetIntValueName);
-    }
-    dynamic getIntValue([Function responseFactory = null]) {
-      var params = new _SmallCacheGetIntValueParams();
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _smallCacheMethodGetIntValueName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-}
-
-
-class SmallCacheProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  SmallCache ptr;
-
-  SmallCacheProxy(_SmallCacheProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _SmallCacheProxyCalls(proxyImpl);
-
+class SmallCacheProxy extends bindings.Proxy
+                              implements SmallCache {
   SmallCacheProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _SmallCacheProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _SmallCacheProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _SmallCacheProxyControl.fromEndpoint(endpoint));
 
-  SmallCacheProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _SmallCacheProxyImpl.fromHandle(handle) {
-    ptr = new _SmallCacheProxyCalls(impl);
-  }
+  SmallCacheProxy.fromHandle(core.MojoHandle handle)
+      : super(new _SmallCacheProxyControl.fromHandle(handle));
 
-  SmallCacheProxy.unbound() :
-      impl = new _SmallCacheProxyImpl.unbound() {
-    ptr = new _SmallCacheProxyCalls(impl);
+  SmallCacheProxy.unbound()
+      : super(new _SmallCacheProxyControl.unbound());
+
+  static SmallCacheProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For SmallCacheProxy"));
+    return new SmallCacheProxy.fromEndpoint(endpoint);
   }
 
   factory SmallCacheProxy.connectToService(
@@ -3081,30 +3050,24 @@
     return p;
   }
 
-  static SmallCacheProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For SmallCacheProxy"));
-    return new SmallCacheProxy.fromEndpoint(endpoint);
+
+  void setIntValue(int intValue) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _SmallCacheSetIntValueParams();
+    params.intValue = intValue;
+    ctrl.sendMessage(params,
+        _smallCacheMethodSetIntValueName);
   }
-
-  String get serviceName => SmallCache.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "SmallCacheProxy($impl)";
+  dynamic getIntValue([Function responseFactory = null]) {
+    var params = new _SmallCacheGetIntValueParams();
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _smallCacheMethodGetIntValueName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
 }
 
@@ -3235,24 +3198,22 @@
 }
 
 
-class _UnionInterfaceProxyImpl extends bindings.Proxy {
-  _UnionInterfaceProxyImpl.fromEndpoint(
+class _UnionInterfaceProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _UnionInterfaceProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _UnionInterfaceProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _UnionInterfaceProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _UnionInterfaceProxyImpl.unbound() : super.unbound();
-
-  static _UnionInterfaceProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _UnionInterfaceProxyImpl"));
-    return new _UnionInterfaceProxyImpl.fromEndpoint(endpoint);
-  }
+  _UnionInterfaceProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _UnionInterfaceServiceDescription();
+      new _UnionInterfaceServiceDescription();
 
+  String get serviceName => UnionInterface.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _unionInterfaceMethodEchoName:
@@ -3282,51 +3243,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_UnionInterfaceProxyImpl($superString)";
+    return "_UnionInterfaceProxyControl($superString)";
   }
 }
 
 
-class _UnionInterfaceProxyCalls implements UnionInterface {
-  _UnionInterfaceProxyImpl _proxyImpl;
-
-  _UnionInterfaceProxyCalls(this._proxyImpl);
-    dynamic echo(PodUnion inVal,[Function responseFactory = null]) {
-      var params = new _UnionInterfaceEchoParams();
-      params.inVal = inVal;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _unionInterfaceMethodEchoName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-}
-
-
-class UnionInterfaceProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  UnionInterface ptr;
-
-  UnionInterfaceProxy(_UnionInterfaceProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _UnionInterfaceProxyCalls(proxyImpl);
-
+class UnionInterfaceProxy extends bindings.Proxy
+                              implements UnionInterface {
   UnionInterfaceProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _UnionInterfaceProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _UnionInterfaceProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _UnionInterfaceProxyControl.fromEndpoint(endpoint));
 
-  UnionInterfaceProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _UnionInterfaceProxyImpl.fromHandle(handle) {
-    ptr = new _UnionInterfaceProxyCalls(impl);
-  }
+  UnionInterfaceProxy.fromHandle(core.MojoHandle handle)
+      : super(new _UnionInterfaceProxyControl.fromHandle(handle));
 
-  UnionInterfaceProxy.unbound() :
-      impl = new _UnionInterfaceProxyImpl.unbound() {
-    ptr = new _UnionInterfaceProxyCalls(impl);
+  UnionInterfaceProxy.unbound()
+      : super(new _UnionInterfaceProxyControl.unbound());
+
+  static UnionInterfaceProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For UnionInterfaceProxy"));
+    return new UnionInterfaceProxy.fromEndpoint(endpoint);
   }
 
   factory UnionInterfaceProxy.connectToService(
@@ -3336,30 +3276,15 @@
     return p;
   }
 
-  static UnionInterfaceProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For UnionInterfaceProxy"));
-    return new UnionInterfaceProxy.fromEndpoint(endpoint);
-  }
 
-  String get serviceName => UnionInterface.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "UnionInterfaceProxy($impl)";
+  dynamic echo(PodUnion inVal,[Function responseFactory = null]) {
+    var params = new _UnionInterfaceEchoParams();
+    params.inVal = inVal;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _unionInterfaceMethodEchoName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
 }
 
@@ -3481,7 +3406,7 @@
   // serializedRuntimeTypeInfo contains the bytes of the Mojo serialization of
   // a mojom_types.RuntimeTypeInfo struct describing the Mojom types in this
   // file. The string contains the base64 encoding of the gzip-compressed bytes.
-  var serializedRuntimeTypeInfo = "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";
+  var serializedRuntimeTypeInfo = "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";
 
   // Deserialize RuntimeTypeInfo
   var bytes = BASE64.decode(serializedRuntimeTypeInfo);
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 f860b31..c3d72e9 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
@@ -3369,24 +3369,22 @@
 }
 
 
-class _InterfaceAProxyImpl extends bindings.Proxy {
-  _InterfaceAProxyImpl.fromEndpoint(
+class _InterfaceAProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _InterfaceAProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _InterfaceAProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _InterfaceAProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _InterfaceAProxyImpl.unbound() : super.unbound();
-
-  static _InterfaceAProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _InterfaceAProxyImpl"));
-    return new _InterfaceAProxyImpl.fromEndpoint(endpoint);
-  }
+  _InterfaceAProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _InterfaceAServiceDescription();
+      new _InterfaceAServiceDescription();
 
+  String get serviceName => InterfaceA.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -3396,40 +3394,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_InterfaceAProxyImpl($superString)";
+    return "_InterfaceAProxyControl($superString)";
   }
 }
 
 
-class _InterfaceAProxyCalls implements InterfaceA {
-  _InterfaceAProxyCalls(_InterfaceAProxyImpl _);
-}
-
-
-class InterfaceAProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  InterfaceA ptr;
-
-  InterfaceAProxy(_InterfaceAProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _InterfaceAProxyCalls(proxyImpl);
-
+class InterfaceAProxy extends bindings.Proxy
+                              implements InterfaceA {
   InterfaceAProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _InterfaceAProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _InterfaceAProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _InterfaceAProxyControl.fromEndpoint(endpoint));
 
-  InterfaceAProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _InterfaceAProxyImpl.fromHandle(handle) {
-    ptr = new _InterfaceAProxyCalls(impl);
-  }
+  InterfaceAProxy.fromHandle(core.MojoHandle handle)
+      : super(new _InterfaceAProxyControl.fromHandle(handle));
 
-  InterfaceAProxy.unbound() :
-      impl = new _InterfaceAProxyImpl.unbound() {
-    ptr = new _InterfaceAProxyCalls(impl);
+  InterfaceAProxy.unbound()
+      : super(new _InterfaceAProxyControl.unbound());
+
+  static InterfaceAProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For InterfaceAProxy"));
+    return new InterfaceAProxy.fromEndpoint(endpoint);
   }
 
   factory InterfaceAProxy.connectToService(
@@ -3439,31 +3427,7 @@
     return p;
   }
 
-  static InterfaceAProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For InterfaceAProxy"));
-    return new InterfaceAProxy.fromEndpoint(endpoint);
-  }
 
-  String get serviceName => InterfaceA.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "InterfaceAProxy($impl)";
-  }
 }
 
 
@@ -3568,24 +3532,22 @@
 }
 
 
-class _BoundsCheckTestInterfaceProxyImpl extends bindings.Proxy {
-  _BoundsCheckTestInterfaceProxyImpl.fromEndpoint(
+class _BoundsCheckTestInterfaceProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _BoundsCheckTestInterfaceProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _BoundsCheckTestInterfaceProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _BoundsCheckTestInterfaceProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _BoundsCheckTestInterfaceProxyImpl.unbound() : super.unbound();
-
-  static _BoundsCheckTestInterfaceProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _BoundsCheckTestInterfaceProxyImpl"));
-    return new _BoundsCheckTestInterfaceProxyImpl.fromEndpoint(endpoint);
-  }
+  _BoundsCheckTestInterfaceProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _BoundsCheckTestInterfaceServiceDescription();
+      new _BoundsCheckTestInterfaceServiceDescription();
 
+  String get serviceName => BoundsCheckTestInterface.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _boundsCheckTestInterfaceMethodMethod0Name:
@@ -3615,60 +3577,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_BoundsCheckTestInterfaceProxyImpl($superString)";
+    return "_BoundsCheckTestInterfaceProxyControl($superString)";
   }
 }
 
 
-class _BoundsCheckTestInterfaceProxyCalls implements BoundsCheckTestInterface {
-  _BoundsCheckTestInterfaceProxyImpl _proxyImpl;
-
-  _BoundsCheckTestInterfaceProxyCalls(this._proxyImpl);
-    dynamic method0(int param0,[Function responseFactory = null]) {
-      var params = new _BoundsCheckTestInterfaceMethod0Params();
-      params.param0 = param0;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _boundsCheckTestInterfaceMethodMethod0Name,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    void method1(int param0) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _BoundsCheckTestInterfaceMethod1Params();
-      params.param0 = param0;
-      _proxyImpl.sendMessage(params, _boundsCheckTestInterfaceMethodMethod1Name);
-    }
-}
-
-
-class BoundsCheckTestInterfaceProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  BoundsCheckTestInterface ptr;
-
-  BoundsCheckTestInterfaceProxy(_BoundsCheckTestInterfaceProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _BoundsCheckTestInterfaceProxyCalls(proxyImpl);
-
+class BoundsCheckTestInterfaceProxy extends bindings.Proxy
+                              implements BoundsCheckTestInterface {
   BoundsCheckTestInterfaceProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _BoundsCheckTestInterfaceProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _BoundsCheckTestInterfaceProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _BoundsCheckTestInterfaceProxyControl.fromEndpoint(endpoint));
 
-  BoundsCheckTestInterfaceProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _BoundsCheckTestInterfaceProxyImpl.fromHandle(handle) {
-    ptr = new _BoundsCheckTestInterfaceProxyCalls(impl);
-  }
+  BoundsCheckTestInterfaceProxy.fromHandle(core.MojoHandle handle)
+      : super(new _BoundsCheckTestInterfaceProxyControl.fromHandle(handle));
 
-  BoundsCheckTestInterfaceProxy.unbound() :
-      impl = new _BoundsCheckTestInterfaceProxyImpl.unbound() {
-    ptr = new _BoundsCheckTestInterfaceProxyCalls(impl);
+  BoundsCheckTestInterfaceProxy.unbound()
+      : super(new _BoundsCheckTestInterfaceProxyControl.unbound());
+
+  static BoundsCheckTestInterfaceProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For BoundsCheckTestInterfaceProxy"));
+    return new BoundsCheckTestInterfaceProxy.fromEndpoint(endpoint);
   }
 
   factory BoundsCheckTestInterfaceProxy.connectToService(
@@ -3678,30 +3610,25 @@
     return p;
   }
 
-  static BoundsCheckTestInterfaceProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For BoundsCheckTestInterfaceProxy"));
-    return new BoundsCheckTestInterfaceProxy.fromEndpoint(endpoint);
+
+  dynamic method0(int param0,[Function responseFactory = null]) {
+    var params = new _BoundsCheckTestInterfaceMethod0Params();
+    params.param0 = param0;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _boundsCheckTestInterfaceMethodMethod0Name,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
-
-  String get serviceName => BoundsCheckTestInterface.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "BoundsCheckTestInterfaceProxy($impl)";
+  void method1(int param0) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _BoundsCheckTestInterfaceMethod1Params();
+    params.param0 = param0;
+    ctrl.sendMessage(params,
+        _boundsCheckTestInterfaceMethodMethod1Name);
   }
 }
 
@@ -3864,24 +3791,22 @@
 }
 
 
-class _ConformanceTestInterfaceProxyImpl extends bindings.Proxy {
-  _ConformanceTestInterfaceProxyImpl.fromEndpoint(
+class _ConformanceTestInterfaceProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _ConformanceTestInterfaceProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _ConformanceTestInterfaceProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _ConformanceTestInterfaceProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _ConformanceTestInterfaceProxyImpl.unbound() : super.unbound();
-
-  static _ConformanceTestInterfaceProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _ConformanceTestInterfaceProxyImpl"));
-    return new _ConformanceTestInterfaceProxyImpl.fromEndpoint(endpoint);
-  }
+  _ConformanceTestInterfaceProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _ConformanceTestInterfaceServiceDescription();
+      new _ConformanceTestInterfaceServiceDescription();
 
+  String get serviceName => ConformanceTestInterface.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _conformanceTestInterfaceMethodMethod12Name:
@@ -3911,192 +3836,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_ConformanceTestInterfaceProxyImpl($superString)";
+    return "_ConformanceTestInterfaceProxyControl($superString)";
   }
 }
 
 
-class _ConformanceTestInterfaceProxyCalls implements ConformanceTestInterface {
-  _ConformanceTestInterfaceProxyImpl _proxyImpl;
-
-  _ConformanceTestInterfaceProxyCalls(this._proxyImpl);
-    void method0(double param0) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _ConformanceTestInterfaceMethod0Params();
-      params.param0 = param0;
-      _proxyImpl.sendMessage(params, _conformanceTestInterfaceMethodMethod0Name);
-    }
-    void method1(StructA param0) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _ConformanceTestInterfaceMethod1Params();
-      params.param0 = param0;
-      _proxyImpl.sendMessage(params, _conformanceTestInterfaceMethodMethod1Name);
-    }
-    void method2(StructB param0, StructA param1) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _ConformanceTestInterfaceMethod2Params();
-      params.param0 = param0;
-      params.param1 = param1;
-      _proxyImpl.sendMessage(params, _conformanceTestInterfaceMethodMethod2Name);
-    }
-    void method3(List<bool> param0) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _ConformanceTestInterfaceMethod3Params();
-      params.param0 = param0;
-      _proxyImpl.sendMessage(params, _conformanceTestInterfaceMethodMethod3Name);
-    }
-    void method4(StructC param0, List<int> param1) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _ConformanceTestInterfaceMethod4Params();
-      params.param0 = param0;
-      params.param1 = param1;
-      _proxyImpl.sendMessage(params, _conformanceTestInterfaceMethodMethod4Name);
-    }
-    void method5(StructE param0, core.MojoDataPipeProducer param1) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _ConformanceTestInterfaceMethod5Params();
-      params.param0 = param0;
-      params.param1 = param1;
-      _proxyImpl.sendMessage(params, _conformanceTestInterfaceMethodMethod5Name);
-    }
-    void method6(List<List<int>> param0) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _ConformanceTestInterfaceMethod6Params();
-      params.param0 = param0;
-      _proxyImpl.sendMessage(params, _conformanceTestInterfaceMethodMethod6Name);
-    }
-    void method7(StructF param0, List<List<int>> param1) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _ConformanceTestInterfaceMethod7Params();
-      params.param0 = param0;
-      params.param1 = param1;
-      _proxyImpl.sendMessage(params, _conformanceTestInterfaceMethodMethod7Name);
-    }
-    void method8(List<List<String>> param0) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _ConformanceTestInterfaceMethod8Params();
-      params.param0 = param0;
-      _proxyImpl.sendMessage(params, _conformanceTestInterfaceMethodMethod8Name);
-    }
-    void method9(List<List<core.MojoHandle>> param0) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _ConformanceTestInterfaceMethod9Params();
-      params.param0 = param0;
-      _proxyImpl.sendMessage(params, _conformanceTestInterfaceMethodMethod9Name);
-    }
-    void method10(Map<String, int> param0) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _ConformanceTestInterfaceMethod10Params();
-      params.param0 = param0;
-      _proxyImpl.sendMessage(params, _conformanceTestInterfaceMethodMethod10Name);
-    }
-    void method11(StructG param0) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _ConformanceTestInterfaceMethod11Params();
-      params.param0 = param0;
-      _proxyImpl.sendMessage(params, _conformanceTestInterfaceMethodMethod11Name);
-    }
-    dynamic method12(double param0,[Function responseFactory = null]) {
-      var params = new _ConformanceTestInterfaceMethod12Params();
-      params.param0 = param0;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _conformanceTestInterfaceMethodMethod12Name,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    void method13(Object param0, int param1, Object param2) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _ConformanceTestInterfaceMethod13Params();
-      params.param0 = param0;
-      params.param1 = param1;
-      params.param2 = param2;
-      _proxyImpl.sendMessage(params, _conformanceTestInterfaceMethodMethod13Name);
-    }
-    void method14(UnionA param0) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _ConformanceTestInterfaceMethod14Params();
-      params.param0 = param0;
-      _proxyImpl.sendMessage(params, _conformanceTestInterfaceMethodMethod14Name);
-    }
-    void method15(StructH param0) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _ConformanceTestInterfaceMethod15Params();
-      params.param0 = param0;
-      _proxyImpl.sendMessage(params, _conformanceTestInterfaceMethodMethod15Name);
-    }
-}
-
-
-class ConformanceTestInterfaceProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  ConformanceTestInterface ptr;
-
-  ConformanceTestInterfaceProxy(_ConformanceTestInterfaceProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _ConformanceTestInterfaceProxyCalls(proxyImpl);
-
+class ConformanceTestInterfaceProxy extends bindings.Proxy
+                              implements ConformanceTestInterface {
   ConformanceTestInterfaceProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _ConformanceTestInterfaceProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _ConformanceTestInterfaceProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _ConformanceTestInterfaceProxyControl.fromEndpoint(endpoint));
 
-  ConformanceTestInterfaceProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _ConformanceTestInterfaceProxyImpl.fromHandle(handle) {
-    ptr = new _ConformanceTestInterfaceProxyCalls(impl);
-  }
+  ConformanceTestInterfaceProxy.fromHandle(core.MojoHandle handle)
+      : super(new _ConformanceTestInterfaceProxyControl.fromHandle(handle));
 
-  ConformanceTestInterfaceProxy.unbound() :
-      impl = new _ConformanceTestInterfaceProxyImpl.unbound() {
-    ptr = new _ConformanceTestInterfaceProxyCalls(impl);
+  ConformanceTestInterfaceProxy.unbound()
+      : super(new _ConformanceTestInterfaceProxyControl.unbound());
+
+  static ConformanceTestInterfaceProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ConformanceTestInterfaceProxy"));
+    return new ConformanceTestInterfaceProxy.fromEndpoint(endpoint);
   }
 
   factory ConformanceTestInterfaceProxy.connectToService(
@@ -4106,30 +3869,171 @@
     return p;
   }
 
-  static ConformanceTestInterfaceProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For ConformanceTestInterfaceProxy"));
-    return new ConformanceTestInterfaceProxy.fromEndpoint(endpoint);
+
+  void method0(double param0) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _ConformanceTestInterfaceMethod0Params();
+    params.param0 = param0;
+    ctrl.sendMessage(params,
+        _conformanceTestInterfaceMethodMethod0Name);
   }
-
-  String get serviceName => ConformanceTestInterface.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
+  void method1(StructA param0) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _ConformanceTestInterfaceMethod1Params();
+    params.param0 = param0;
+    ctrl.sendMessage(params,
+        _conformanceTestInterfaceMethodMethod1Name);
   }
-
-  String toString() {
-    return "ConformanceTestInterfaceProxy($impl)";
+  void method2(StructB param0, StructA param1) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _ConformanceTestInterfaceMethod2Params();
+    params.param0 = param0;
+    params.param1 = param1;
+    ctrl.sendMessage(params,
+        _conformanceTestInterfaceMethodMethod2Name);
+  }
+  void method3(List<bool> param0) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _ConformanceTestInterfaceMethod3Params();
+    params.param0 = param0;
+    ctrl.sendMessage(params,
+        _conformanceTestInterfaceMethodMethod3Name);
+  }
+  void method4(StructC param0, List<int> param1) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _ConformanceTestInterfaceMethod4Params();
+    params.param0 = param0;
+    params.param1 = param1;
+    ctrl.sendMessage(params,
+        _conformanceTestInterfaceMethodMethod4Name);
+  }
+  void method5(StructE param0, core.MojoDataPipeProducer param1) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _ConformanceTestInterfaceMethod5Params();
+    params.param0 = param0;
+    params.param1 = param1;
+    ctrl.sendMessage(params,
+        _conformanceTestInterfaceMethodMethod5Name);
+  }
+  void method6(List<List<int>> param0) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _ConformanceTestInterfaceMethod6Params();
+    params.param0 = param0;
+    ctrl.sendMessage(params,
+        _conformanceTestInterfaceMethodMethod6Name);
+  }
+  void method7(StructF param0, List<List<int>> param1) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _ConformanceTestInterfaceMethod7Params();
+    params.param0 = param0;
+    params.param1 = param1;
+    ctrl.sendMessage(params,
+        _conformanceTestInterfaceMethodMethod7Name);
+  }
+  void method8(List<List<String>> param0) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _ConformanceTestInterfaceMethod8Params();
+    params.param0 = param0;
+    ctrl.sendMessage(params,
+        _conformanceTestInterfaceMethodMethod8Name);
+  }
+  void method9(List<List<core.MojoHandle>> param0) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _ConformanceTestInterfaceMethod9Params();
+    params.param0 = param0;
+    ctrl.sendMessage(params,
+        _conformanceTestInterfaceMethodMethod9Name);
+  }
+  void method10(Map<String, int> param0) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _ConformanceTestInterfaceMethod10Params();
+    params.param0 = param0;
+    ctrl.sendMessage(params,
+        _conformanceTestInterfaceMethodMethod10Name);
+  }
+  void method11(StructG param0) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _ConformanceTestInterfaceMethod11Params();
+    params.param0 = param0;
+    ctrl.sendMessage(params,
+        _conformanceTestInterfaceMethodMethod11Name);
+  }
+  dynamic method12(double param0,[Function responseFactory = null]) {
+    var params = new _ConformanceTestInterfaceMethod12Params();
+    params.param0 = param0;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _conformanceTestInterfaceMethodMethod12Name,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
+  }
+  void method13(Object param0, int param1, Object param2) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _ConformanceTestInterfaceMethod13Params();
+    params.param0 = param0;
+    params.param1 = param1;
+    params.param2 = param2;
+    ctrl.sendMessage(params,
+        _conformanceTestInterfaceMethodMethod13Name);
+  }
+  void method14(UnionA param0) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _ConformanceTestInterfaceMethod14Params();
+    params.param0 = param0;
+    ctrl.sendMessage(params,
+        _conformanceTestInterfaceMethodMethod14Name);
+  }
+  void method15(StructH param0) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _ConformanceTestInterfaceMethod15Params();
+    params.param0 = param0;
+    ctrl.sendMessage(params,
+        _conformanceTestInterfaceMethodMethod15Name);
   }
 }
 
@@ -4332,24 +4236,22 @@
 }
 
 
-class _IntegrationTestInterfaceProxyImpl extends bindings.Proxy {
-  _IntegrationTestInterfaceProxyImpl.fromEndpoint(
+class _IntegrationTestInterfaceProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _IntegrationTestInterfaceProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _IntegrationTestInterfaceProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _IntegrationTestInterfaceProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _IntegrationTestInterfaceProxyImpl.unbound() : super.unbound();
-
-  static _IntegrationTestInterfaceProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _IntegrationTestInterfaceProxyImpl"));
-    return new _IntegrationTestInterfaceProxyImpl.fromEndpoint(endpoint);
-  }
+  _IntegrationTestInterfaceProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _IntegrationTestInterfaceServiceDescription();
+      new _IntegrationTestInterfaceServiceDescription();
 
+  String get serviceName => IntegrationTestInterface.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _integrationTestInterfaceMethodMethod0Name:
@@ -4379,51 +4281,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_IntegrationTestInterfaceProxyImpl($superString)";
+    return "_IntegrationTestInterfaceProxyControl($superString)";
   }
 }
 
 
-class _IntegrationTestInterfaceProxyCalls implements IntegrationTestInterface {
-  _IntegrationTestInterfaceProxyImpl _proxyImpl;
-
-  _IntegrationTestInterfaceProxyCalls(this._proxyImpl);
-    dynamic method0(BasicStruct param0,[Function responseFactory = null]) {
-      var params = new _IntegrationTestInterfaceMethod0Params();
-      params.param0 = param0;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _integrationTestInterfaceMethodMethod0Name,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-}
-
-
-class IntegrationTestInterfaceProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  IntegrationTestInterface ptr;
-
-  IntegrationTestInterfaceProxy(_IntegrationTestInterfaceProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _IntegrationTestInterfaceProxyCalls(proxyImpl);
-
+class IntegrationTestInterfaceProxy extends bindings.Proxy
+                              implements IntegrationTestInterface {
   IntegrationTestInterfaceProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _IntegrationTestInterfaceProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _IntegrationTestInterfaceProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _IntegrationTestInterfaceProxyControl.fromEndpoint(endpoint));
 
-  IntegrationTestInterfaceProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _IntegrationTestInterfaceProxyImpl.fromHandle(handle) {
-    ptr = new _IntegrationTestInterfaceProxyCalls(impl);
-  }
+  IntegrationTestInterfaceProxy.fromHandle(core.MojoHandle handle)
+      : super(new _IntegrationTestInterfaceProxyControl.fromHandle(handle));
 
-  IntegrationTestInterfaceProxy.unbound() :
-      impl = new _IntegrationTestInterfaceProxyImpl.unbound() {
-    ptr = new _IntegrationTestInterfaceProxyCalls(impl);
+  IntegrationTestInterfaceProxy.unbound()
+      : super(new _IntegrationTestInterfaceProxyControl.unbound());
+
+  static IntegrationTestInterfaceProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For IntegrationTestInterfaceProxy"));
+    return new IntegrationTestInterfaceProxy.fromEndpoint(endpoint);
   }
 
   factory IntegrationTestInterfaceProxy.connectToService(
@@ -4433,30 +4314,15 @@
     return p;
   }
 
-  static IntegrationTestInterfaceProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For IntegrationTestInterfaceProxy"));
-    return new IntegrationTestInterfaceProxy.fromEndpoint(endpoint);
-  }
 
-  String get serviceName => IntegrationTestInterface.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "IntegrationTestInterfaceProxy($impl)";
+  dynamic method0(BasicStruct param0,[Function responseFactory = null]) {
+    var params = new _IntegrationTestInterfaceMethod0Params();
+    params.param0 = param0;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _integrationTestInterfaceMethodMethod0Name,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
 }
 
@@ -4578,7 +4444,7 @@
   // serializedRuntimeTypeInfo contains the bytes of the Mojo serialization of
   // a mojom_types.RuntimeTypeInfo struct describing the Mojom types in this
   // file. The string contains the base64 encoding of the gzip-compressed bytes.
-  var serializedRuntimeTypeInfo = "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";
+  var serializedRuntimeTypeInfo = "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";
 
   // Deserialize RuntimeTypeInfo
   var bytes = BASE64.decode(serializedRuntimeTypeInfo);
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 31930de..e88afa0 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
@@ -806,24 +806,22 @@
 }
 
 
-class _HumanResourceDatabaseProxyImpl extends bindings.Proxy {
-  _HumanResourceDatabaseProxyImpl.fromEndpoint(
+class _HumanResourceDatabaseProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _HumanResourceDatabaseProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _HumanResourceDatabaseProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _HumanResourceDatabaseProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _HumanResourceDatabaseProxyImpl.unbound() : super.unbound();
-
-  static _HumanResourceDatabaseProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _HumanResourceDatabaseProxyImpl"));
-    return new _HumanResourceDatabaseProxyImpl.fromEndpoint(endpoint);
-  }
+  _HumanResourceDatabaseProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _HumanResourceDatabaseServiceDescription();
+      new _HumanResourceDatabaseServiceDescription();
 
+  String get serviceName => HumanResourceDatabase.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _humanResourceDatabaseMethodAddEmployeeName:
@@ -913,79 +911,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_HumanResourceDatabaseProxyImpl($superString)";
+    return "_HumanResourceDatabaseProxyControl($superString)";
   }
 }
 
 
-class _HumanResourceDatabaseProxyCalls implements HumanResourceDatabase {
-  _HumanResourceDatabaseProxyImpl _proxyImpl;
-
-  _HumanResourceDatabaseProxyCalls(this._proxyImpl);
-    dynamic addEmployee(Employee employee,[Function responseFactory = null]) {
-      var params = new _HumanResourceDatabaseAddEmployeeParams();
-      params.employee = employee;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _humanResourceDatabaseMethodAddEmployeeName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    dynamic queryEmployee(int id,bool retrieveFingerPrint,[Function responseFactory = null]) {
-      var params = new _HumanResourceDatabaseQueryEmployeeParams();
-      params.id = id;
-      params.retrieveFingerPrint = retrieveFingerPrint;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _humanResourceDatabaseMethodQueryEmployeeName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    dynamic attachFingerPrint(int id,List<int> fingerPrint,[Function responseFactory = null]) {
-      var params = new _HumanResourceDatabaseAttachFingerPrintParams();
-      params.id = id;
-      params.fingerPrint = fingerPrint;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _humanResourceDatabaseMethodAttachFingerPrintName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    dynamic listEmployeeIds([Function responseFactory = null]) {
-      var params = new _HumanResourceDatabaseListEmployeeIdsParams();
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _humanResourceDatabaseMethodListEmployeeIdsName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-}
-
-
-class HumanResourceDatabaseProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  HumanResourceDatabase ptr;
-
-  HumanResourceDatabaseProxy(_HumanResourceDatabaseProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _HumanResourceDatabaseProxyCalls(proxyImpl);
-
+class HumanResourceDatabaseProxy extends bindings.Proxy
+                              implements HumanResourceDatabase {
   HumanResourceDatabaseProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _HumanResourceDatabaseProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _HumanResourceDatabaseProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _HumanResourceDatabaseProxyControl.fromEndpoint(endpoint));
 
-  HumanResourceDatabaseProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _HumanResourceDatabaseProxyImpl.fromHandle(handle) {
-    ptr = new _HumanResourceDatabaseProxyCalls(impl);
-  }
+  HumanResourceDatabaseProxy.fromHandle(core.MojoHandle handle)
+      : super(new _HumanResourceDatabaseProxyControl.fromHandle(handle));
 
-  HumanResourceDatabaseProxy.unbound() :
-      impl = new _HumanResourceDatabaseProxyImpl.unbound() {
-    ptr = new _HumanResourceDatabaseProxyCalls(impl);
+  HumanResourceDatabaseProxy.unbound()
+      : super(new _HumanResourceDatabaseProxyControl.unbound());
+
+  static HumanResourceDatabaseProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For HumanResourceDatabaseProxy"));
+    return new HumanResourceDatabaseProxy.fromEndpoint(endpoint);
   }
 
   factory HumanResourceDatabaseProxy.connectToService(
@@ -995,30 +944,43 @@
     return p;
   }
 
-  static HumanResourceDatabaseProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For HumanResourceDatabaseProxy"));
-    return new HumanResourceDatabaseProxy.fromEndpoint(endpoint);
+
+  dynamic addEmployee(Employee employee,[Function responseFactory = null]) {
+    var params = new _HumanResourceDatabaseAddEmployeeParams();
+    params.employee = employee;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _humanResourceDatabaseMethodAddEmployeeName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
-
-  String get serviceName => HumanResourceDatabase.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
+  dynamic queryEmployee(int id,bool retrieveFingerPrint,[Function responseFactory = null]) {
+    var params = new _HumanResourceDatabaseQueryEmployeeParams();
+    params.id = id;
+    params.retrieveFingerPrint = retrieveFingerPrint;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _humanResourceDatabaseMethodQueryEmployeeName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
-
-  String toString() {
-    return "HumanResourceDatabaseProxy($impl)";
+  dynamic attachFingerPrint(int id,List<int> fingerPrint,[Function responseFactory = null]) {
+    var params = new _HumanResourceDatabaseAttachFingerPrintParams();
+    params.id = id;
+    params.fingerPrint = fingerPrint;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _humanResourceDatabaseMethodAttachFingerPrintName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
+  }
+  dynamic listEmployeeIds([Function responseFactory = null]) {
+    var params = new _HumanResourceDatabaseListEmployeeIdsParams();
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _humanResourceDatabaseMethodListEmployeeIdsName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
 }
 
@@ -1220,7 +1182,7 @@
   // serializedRuntimeTypeInfo contains the bytes of the Mojo serialization of
   // a mojom_types.RuntimeTypeInfo struct describing the Mojom types in this
   // file. The string contains the base64 encoding of the gzip-compressed bytes.
-  var serializedRuntimeTypeInfo = "H4sIAAAJbogC/+xaT4/bRBS3nS1rtlRd+i+GwjYLAqJC4wqEFKWXXbFBRRQUWFRRcQheZ0qM1nawnVV64yNw5MhH6JEjx34EjnyEPfZGZ5o39WQ8YzuJ106kHenJa8eZmfeb937ze7MxlGnbhuvfcOWf95h7FZsO959ju4PN9X/1O50IhVGnc4KC0PE9x/ul07k/di3vexT648BGB1ZkHVkhEvRzD9tn2H541Ov2v+4+6pAOW6S/VtxdS9Zbcr7P4NrAVmM+34PrEK53sTUzxz1AIyuIXORFLfzuh5nvd93Rsf8EoeX9asP8qV9Nbh3+rMX35M+/dPH66eqs/wrjP/v8f2g/KuJ2BdsWthiR6fOPsN2COEiBLzGvi9guYLOx/YTNHPouMoPxwHcdDwUm6c8MA3v6x2h8dOzYpuNFKHhs2Sg0jxxvgIcITTJmaMaD9smDvn3skEUjX3Zf4aIx499VZ3FtKOlNhl87J36XwN/D/QfdQ8idD7Jxa9H3efzeAH/Kwi8LJ7UgnC5CPB90H768/xjb+zlwou/zOF0qGacGx6M0//7dmA+fngSfbeBOyjQkht6V4RPTUQIXct0sGReWj5uUl7RZXNrcPLeUfE2Gq8LgKnpO21WIPQSQ9Z2BMJ7exPZ6ibiJcCHQPZf4oS+Ai8rkN98Iz5DQ9SwXifC4UjIe2xL/WHwusIQkyJ958dFS4obuiwNuX+RxugpcVDYP8X43MvbzeXURr+cMZswaMx6/fzyF9fkPrppkPZ9yuo7y42kKP7LzaQh07SbznOb9IQpOHBt9C2G+sL4lXHwdm+zzT7HdlvG1XA4m4qkO61dWPC2KhyGJPwN4haaqBvHShOf0Pf01iJ/LUI/cEMcTjYc/amezL+wPBsxumvTLqFhnUP+HWn6/SWtL/L4JvjN+3wnQb2M8GaH/tJW5D7B5LtsHnhesH5oZuozqB1F81FeA/w2Jjpy3vk3jfVWS72yc6gXF6TvYriXiNBz5XojWJU7nacvG6WXY/8Kxjd0JhTx2u0J8ZHEk4/t/NvLVn7zelfH9ddBp341R8CSlfnp7Rfh+Uismj6humfGbYfyq84g/vzHUcutGWT5twbygXBTGSb3iejGt6ZLzG/r9iSR/fl9Cf9eY8Wgd8o3jPZz6NhuPAYoCB52g/mPsMwr6o8DxIgnOZoXx2MjgL4PTukbG/nhaUF7vYLshyGu6Q65aXk/U9dBzN0F3lM3/6hnpORHeZF3uq8XyxuSMeeManFlxdKGI1u9eRetHsKDz2OTqx2X5hNdJewDYs434nEXNuV5aCTz/Fpyp7keRZQ+/fLlqPbpognXbqVh3Uf7pzcnPexIcdwGDhP8z1fa5/lpUf+1Arlepv7SU8+hFz+tl9Ute/iO4fFLReYSI/9LqwDS9RPNxWysmH98DLSnKx/hU4fxcYd5zBRJvX6zBuUIb8vRnLf4fhpZzv6wVoG+0jP2yDlg/cMKIqrevBkm8d1fkfOJUKaaOuQW+c36/2iWrzkc9B48pKetPcWoWdC7agL6TeE1ZbB34Syux3qO/O3FwLon4fRd+61R1vbCVI85YfnsRAAD//xqidsPoJwAA";
+  var serializedRuntimeTypeInfo = "H4sIAAAJbogC/+xaT2/jRBS3nUJDl9WW/VfDQtcFAdHCxhUIKcpeWtGgRSwoULRiT5HrTBujxA62U3U57ZEjH4PjHvcj8BE47pEjx95gZv0GT8YztpO4sSN1pKepXccz7zfv/d5vJtGVqG1C/wJ6/n6XuVax1eH6C2z3sY28n712O0RB2G6fIj9wPNdxT9rth5OR5f6AAm/i2+jACq0jK0CC9zzA9jm2H590O71vOk/a5IVN8r5m/Lqm7G3J+f4JvYGtxvx/D/oB9LvYGpnjHqCx5Ycj5IZN/OxHmc93RuOh9xShxf1qwfypXw1uHZ7X4mvy51918fptqtP+K4z/7P1/of2kiNt1bBvYYkSi+x9juwtxkAJfYl5XsL2GzcV2jM2cBL459GxraJ543skQmQNvhMxffcskrzYD347+GE+Oho5tOm6I/GPLRoF55Lh9PFpgkuEDMx6/R2707KFD1o98eBThozHzaKnT+BpKepPh2MqJ41Xw+3D/UecQcujDbPya9HkexzfBn2XjmIWXWhBeVyC+DzqPX11/gu2DHHjR53m8rpaEl8HzKwB0vjYbTl0JTpvAqZSBSEy9J8MppqkkX2BbLwkflq93AZ+uNo1Pi5vvhpKvyfBVGHxF92m7AbGIALqe0xfG11vY3igBPxE+KpuIXKvPgY/K8CTfCA+RUHatERLhcr0kXDYlfrI4ET6uq/K8mhUnLSWOaB3tc3WUx+sGcFVZPMX7b2TogFn1FK8DdWbMGjMeX2dewDr9Db0mWdfnnB6k/PlPCn+y8zEEeniduU/54BD5p46NvoOwn1sXE66+hU32/8+w3ZPxuVxGJuJqC9Zv2XE1Ly66JA514BtKcRrETQPu0+d2X4/6365F/cvb4rg6h/6P2sXUjf1+n6m6Sb/0iugSisOZlt9/0loS/+8ABoz/9330ywTPRIgDbWXUCTb/ZXVCVk/n1RuNDD1H9YYoXrYqVB90iQ6ddd+cVhdUCQ+wcasXFLfvYruZiNtg7LkBWrW4naUtGrfXoE4GExv7Egh57l4FcJLFlawuvFzLt6/l9bKsLtwCfff9BPlPU/Zj71SsLvxeKya/qN6Z8p+pDFXJL/68yFCXux+V5dkGzAu2ocK42arIPjSt1SXnRfTzZ5K8eraAjq8x49H9zLeO+zhybDo+fRT6DjpFvWPsMPJ7Y99xQwneZhXiM4PfdE4z6xn1tL5WTL5vY7styHdaUaua78/U1dCDd0CvlFUn1AvSgyLcyfp01WL55OyC+eQmnJFxNKKI1vFByetIMKHzWef2p4vyDK+vHtLznLX4PEfNuW7aEurA23Cmux+Glj346tXqdeniCdZvuyJ6jTo2mFGv7Unw3AEsEjhM7eYvdduium0bOKAKuk1LORef9/sD2X4oLz8SfD4t+dxDxI9p+8s0nUXz1NCKydP3QYuK8jQ+vbg8v5j3/ILE35crdH6xB/E11uLvVrSc9bVWgC7SMurrFmD+yAlCqvq+7idx36nYOci5Usy+6C5gwPn/f1WtSp7Wc/CckhIPFK9WQeezBrw7iVvEcqvEb9oS95H09zQOzjFRHdiB33RVZf+xkSPuWP77LwAA///UgNHD2CgAAA==";
 
   // Deserialize RuntimeTypeInfo
   var bytes = BASE64.decode(serializedRuntimeTypeInfo);
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 fad2213..505f69e 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
@@ -1943,24 +1943,22 @@
 }
 
 
-class _CheckMethodWithEmptyResponseProxyImpl extends bindings.Proxy {
-  _CheckMethodWithEmptyResponseProxyImpl.fromEndpoint(
+class _CheckMethodWithEmptyResponseProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _CheckMethodWithEmptyResponseProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _CheckMethodWithEmptyResponseProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _CheckMethodWithEmptyResponseProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _CheckMethodWithEmptyResponseProxyImpl.unbound() : super.unbound();
-
-  static _CheckMethodWithEmptyResponseProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _CheckMethodWithEmptyResponseProxyImpl"));
-    return new _CheckMethodWithEmptyResponseProxyImpl.fromEndpoint(endpoint);
-  }
+  _CheckMethodWithEmptyResponseProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _CheckMethodWithEmptyResponseServiceDescription();
+      new _CheckMethodWithEmptyResponseServiceDescription();
 
+  String get serviceName => CheckMethodWithEmptyResponse.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _checkMethodWithEmptyResponseMethodWithoutParameterAndEmptyResponseName:
@@ -2010,59 +2008,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_CheckMethodWithEmptyResponseProxyImpl($superString)";
+    return "_CheckMethodWithEmptyResponseProxyControl($superString)";
   }
 }
 
 
-class _CheckMethodWithEmptyResponseProxyCalls implements CheckMethodWithEmptyResponse {
-  _CheckMethodWithEmptyResponseProxyImpl _proxyImpl;
-
-  _CheckMethodWithEmptyResponseProxyCalls(this._proxyImpl);
-    dynamic withoutParameterAndEmptyResponse([Function responseFactory = null]) {
-      var params = new _CheckMethodWithEmptyResponseWithoutParameterAndEmptyResponseParams();
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _checkMethodWithEmptyResponseMethodWithoutParameterAndEmptyResponseName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    dynamic withParameterAndEmptyResponse(bool b,[Function responseFactory = null]) {
-      var params = new _CheckMethodWithEmptyResponseWithParameterAndEmptyResponseParams();
-      params.b = b;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _checkMethodWithEmptyResponseMethodWithParameterAndEmptyResponseName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-}
-
-
-class CheckMethodWithEmptyResponseProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  CheckMethodWithEmptyResponse ptr;
-
-  CheckMethodWithEmptyResponseProxy(_CheckMethodWithEmptyResponseProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _CheckMethodWithEmptyResponseProxyCalls(proxyImpl);
-
+class CheckMethodWithEmptyResponseProxy extends bindings.Proxy
+                              implements CheckMethodWithEmptyResponse {
   CheckMethodWithEmptyResponseProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _CheckMethodWithEmptyResponseProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _CheckMethodWithEmptyResponseProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _CheckMethodWithEmptyResponseProxyControl.fromEndpoint(endpoint));
 
-  CheckMethodWithEmptyResponseProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _CheckMethodWithEmptyResponseProxyImpl.fromHandle(handle) {
-    ptr = new _CheckMethodWithEmptyResponseProxyCalls(impl);
-  }
+  CheckMethodWithEmptyResponseProxy.fromHandle(core.MojoHandle handle)
+      : super(new _CheckMethodWithEmptyResponseProxyControl.fromHandle(handle));
 
-  CheckMethodWithEmptyResponseProxy.unbound() :
-      impl = new _CheckMethodWithEmptyResponseProxyImpl.unbound() {
-    ptr = new _CheckMethodWithEmptyResponseProxyCalls(impl);
+  CheckMethodWithEmptyResponseProxy.unbound()
+      : super(new _CheckMethodWithEmptyResponseProxyControl.unbound());
+
+  static CheckMethodWithEmptyResponseProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For CheckMethodWithEmptyResponseProxy"));
+    return new CheckMethodWithEmptyResponseProxy.fromEndpoint(endpoint);
   }
 
   factory CheckMethodWithEmptyResponseProxy.connectToService(
@@ -2072,30 +2041,23 @@
     return p;
   }
 
-  static CheckMethodWithEmptyResponseProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For CheckMethodWithEmptyResponseProxy"));
-    return new CheckMethodWithEmptyResponseProxy.fromEndpoint(endpoint);
+
+  dynamic withoutParameterAndEmptyResponse([Function responseFactory = null]) {
+    var params = new _CheckMethodWithEmptyResponseWithoutParameterAndEmptyResponseParams();
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _checkMethodWithEmptyResponseMethodWithoutParameterAndEmptyResponseName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
-
-  String get serviceName => CheckMethodWithEmptyResponse.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "CheckMethodWithEmptyResponseProxy($impl)";
+  dynamic withParameterAndEmptyResponse(bool b,[Function responseFactory = null]) {
+    var params = new _CheckMethodWithEmptyResponseWithParameterAndEmptyResponseParams();
+    params.b = b;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _checkMethodWithEmptyResponseMethodWithParameterAndEmptyResponseName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
 }
 
@@ -2246,24 +2208,22 @@
 }
 
 
-class _CheckNameCollisionProxyImpl extends bindings.Proxy {
-  _CheckNameCollisionProxyImpl.fromEndpoint(
+class _CheckNameCollisionProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _CheckNameCollisionProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _CheckNameCollisionProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _CheckNameCollisionProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _CheckNameCollisionProxyImpl.unbound() : super.unbound();
-
-  static _CheckNameCollisionProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _CheckNameCollisionProxyImpl"));
-    return new _CheckNameCollisionProxyImpl.fromEndpoint(endpoint);
-  }
+  _CheckNameCollisionProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _CheckNameCollisionServiceDescription();
+      new _CheckNameCollisionServiceDescription();
 
+  String get serviceName => CheckNameCollision.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _checkNameCollisionMethodWithNameCollisionName:
@@ -2293,52 +2253,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_CheckNameCollisionProxyImpl($superString)";
+    return "_CheckNameCollisionProxyControl($superString)";
   }
 }
 
 
-class _CheckNameCollisionProxyCalls implements CheckNameCollision {
-  _CheckNameCollisionProxyImpl _proxyImpl;
-
-  _CheckNameCollisionProxyCalls(this._proxyImpl);
-    dynamic withNameCollision(bool message,bool response,[Function responseFactory = null]) {
-      var params = new _CheckNameCollisionWithNameCollisionParams();
-      params.message = message;
-      params.response = response;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _checkNameCollisionMethodWithNameCollisionName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-}
-
-
-class CheckNameCollisionProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  CheckNameCollision ptr;
-
-  CheckNameCollisionProxy(_CheckNameCollisionProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _CheckNameCollisionProxyCalls(proxyImpl);
-
+class CheckNameCollisionProxy extends bindings.Proxy
+                              implements CheckNameCollision {
   CheckNameCollisionProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _CheckNameCollisionProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _CheckNameCollisionProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _CheckNameCollisionProxyControl.fromEndpoint(endpoint));
 
-  CheckNameCollisionProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _CheckNameCollisionProxyImpl.fromHandle(handle) {
-    ptr = new _CheckNameCollisionProxyCalls(impl);
-  }
+  CheckNameCollisionProxy.fromHandle(core.MojoHandle handle)
+      : super(new _CheckNameCollisionProxyControl.fromHandle(handle));
 
-  CheckNameCollisionProxy.unbound() :
-      impl = new _CheckNameCollisionProxyImpl.unbound() {
-    ptr = new _CheckNameCollisionProxyCalls(impl);
+  CheckNameCollisionProxy.unbound()
+      : super(new _CheckNameCollisionProxyControl.unbound());
+
+  static CheckNameCollisionProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For CheckNameCollisionProxy"));
+    return new CheckNameCollisionProxy.fromEndpoint(endpoint);
   }
 
   factory CheckNameCollisionProxy.connectToService(
@@ -2348,30 +2286,16 @@
     return p;
   }
 
-  static CheckNameCollisionProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For CheckNameCollisionProxy"));
-    return new CheckNameCollisionProxy.fromEndpoint(endpoint);
-  }
 
-  String get serviceName => CheckNameCollision.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "CheckNameCollisionProxy($impl)";
+  dynamic withNameCollision(bool message,bool response,[Function responseFactory = null]) {
+    var params = new _CheckNameCollisionWithNameCollisionParams();
+    params.message = message;
+    params.response = response;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _checkNameCollisionMethodWithNameCollisionName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
 }
 
@@ -2500,24 +2424,22 @@
 }
 
 
-class _CheckEnumCapsProxyImpl extends bindings.Proxy {
-  _CheckEnumCapsProxyImpl.fromEndpoint(
+class _CheckEnumCapsProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _CheckEnumCapsProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _CheckEnumCapsProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _CheckEnumCapsProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _CheckEnumCapsProxyImpl.unbound() : super.unbound();
-
-  static _CheckEnumCapsProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _CheckEnumCapsProxyImpl"));
-    return new _CheckEnumCapsProxyImpl.fromEndpoint(endpoint);
-  }
+  _CheckEnumCapsProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _CheckEnumCapsServiceDescription();
+      new _CheckEnumCapsServiceDescription();
 
+  String get serviceName => CheckEnumCaps.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -2527,51 +2449,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_CheckEnumCapsProxyImpl($superString)";
+    return "_CheckEnumCapsProxyControl($superString)";
   }
 }
 
 
-class _CheckEnumCapsProxyCalls implements CheckEnumCaps {
-  _CheckEnumCapsProxyImpl _proxyImpl;
-
-  _CheckEnumCapsProxyCalls(this._proxyImpl);
-    void setEnumWithInternalAllCaps(EnumWithInternalAllCaps e) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _CheckEnumCapsSetEnumWithInternalAllCapsParams();
-      params.e = e;
-      _proxyImpl.sendMessage(params, _checkEnumCapsMethodSetEnumWithInternalAllCapsName);
-    }
-}
-
-
-class CheckEnumCapsProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  CheckEnumCaps ptr;
-
-  CheckEnumCapsProxy(_CheckEnumCapsProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _CheckEnumCapsProxyCalls(proxyImpl);
-
+class CheckEnumCapsProxy extends bindings.Proxy
+                              implements CheckEnumCaps {
   CheckEnumCapsProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _CheckEnumCapsProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _CheckEnumCapsProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _CheckEnumCapsProxyControl.fromEndpoint(endpoint));
 
-  CheckEnumCapsProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _CheckEnumCapsProxyImpl.fromHandle(handle) {
-    ptr = new _CheckEnumCapsProxyCalls(impl);
-  }
+  CheckEnumCapsProxy.fromHandle(core.MojoHandle handle)
+      : super(new _CheckEnumCapsProxyControl.fromHandle(handle));
 
-  CheckEnumCapsProxy.unbound() :
-      impl = new _CheckEnumCapsProxyImpl.unbound() {
-    ptr = new _CheckEnumCapsProxyCalls(impl);
+  CheckEnumCapsProxy.unbound()
+      : super(new _CheckEnumCapsProxyControl.unbound());
+
+  static CheckEnumCapsProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For CheckEnumCapsProxy"));
+    return new CheckEnumCapsProxy.fromEndpoint(endpoint);
   }
 
   factory CheckEnumCapsProxy.connectToService(
@@ -2581,30 +2482,16 @@
     return p;
   }
 
-  static CheckEnumCapsProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For CheckEnumCapsProxy"));
-    return new CheckEnumCapsProxy.fromEndpoint(endpoint);
-  }
 
-  String get serviceName => CheckEnumCaps.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "CheckEnumCapsProxy($impl)";
+  void setEnumWithInternalAllCaps(EnumWithInternalAllCaps e) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _CheckEnumCapsSetEnumWithInternalAllCapsParams();
+    params.e = e;
+    ctrl.sendMessage(params,
+        _checkEnumCapsMethodSetEnumWithInternalAllCapsName);
   }
 }
 
@@ -2710,24 +2597,22 @@
 }
 
 
-class _TestInterfaceProxyImpl extends bindings.Proxy {
-  _TestInterfaceProxyImpl.fromEndpoint(
+class _TestInterfaceProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _TestInterfaceProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _TestInterfaceProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _TestInterfaceProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _TestInterfaceProxyImpl.unbound() : super.unbound();
-
-  static _TestInterfaceProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _TestInterfaceProxyImpl"));
-    return new _TestInterfaceProxyImpl.fromEndpoint(endpoint);
-  }
+  _TestInterfaceProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _TestInterfaceServiceDescription();
+      new _TestInterfaceServiceDescription();
 
+  String get serviceName => TestInterface.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -2737,50 +2622,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_TestInterfaceProxyImpl($superString)";
+    return "_TestInterfaceProxyControl($superString)";
   }
 }
 
 
-class _TestInterfaceProxyCalls implements TestInterface {
-  _TestInterfaceProxyImpl _proxyImpl;
-
-  _TestInterfaceProxyCalls(this._proxyImpl);
-    void someMessage() {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _TestInterfaceSomeMessageParams();
-      _proxyImpl.sendMessage(params, _testInterfaceMethodSomeMessageName);
-    }
-}
-
-
-class TestInterfaceProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  TestInterface ptr;
-
-  TestInterfaceProxy(_TestInterfaceProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _TestInterfaceProxyCalls(proxyImpl);
-
+class TestInterfaceProxy extends bindings.Proxy
+                              implements TestInterface {
   TestInterfaceProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _TestInterfaceProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _TestInterfaceProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _TestInterfaceProxyControl.fromEndpoint(endpoint));
 
-  TestInterfaceProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _TestInterfaceProxyImpl.fromHandle(handle) {
-    ptr = new _TestInterfaceProxyCalls(impl);
-  }
+  TestInterfaceProxy.fromHandle(core.MojoHandle handle)
+      : super(new _TestInterfaceProxyControl.fromHandle(handle));
 
-  TestInterfaceProxy.unbound() :
-      impl = new _TestInterfaceProxyImpl.unbound() {
-    ptr = new _TestInterfaceProxyCalls(impl);
+  TestInterfaceProxy.unbound()
+      : super(new _TestInterfaceProxyControl.unbound());
+
+  static TestInterfaceProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For TestInterfaceProxy"));
+    return new TestInterfaceProxy.fromEndpoint(endpoint);
   }
 
   factory TestInterfaceProxy.connectToService(
@@ -2790,30 +2655,15 @@
     return p;
   }
 
-  static TestInterfaceProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For TestInterfaceProxy"));
-    return new TestInterfaceProxy.fromEndpoint(endpoint);
-  }
 
-  String get serviceName => TestInterface.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "TestInterfaceProxy($impl)";
+  void someMessage() {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _TestInterfaceSomeMessageParams();
+    ctrl.sendMessage(params,
+        _testInterfaceMethodSomeMessageName);
   }
 }
 
@@ -2917,24 +2767,22 @@
 }
 
 
-class _Regression551ProxyImpl extends bindings.Proxy {
-  _Regression551ProxyImpl.fromEndpoint(
+class _Regression551ProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _Regression551ProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _Regression551ProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _Regression551ProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _Regression551ProxyImpl.unbound() : super.unbound();
-
-  static _Regression551ProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _Regression551ProxyImpl"));
-    return new _Regression551ProxyImpl.fromEndpoint(endpoint);
-  }
+  _Regression551ProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _Regression551ServiceDescription();
+      new _Regression551ServiceDescription();
 
+  String get serviceName => Regression551.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _regression551MethodGetName:
@@ -2964,51 +2812,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_Regression551ProxyImpl($superString)";
+    return "_Regression551ProxyControl($superString)";
   }
 }
 
 
-class _Regression551ProxyCalls implements Regression551 {
-  _Regression551ProxyImpl _proxyImpl;
-
-  _Regression551ProxyCalls(this._proxyImpl);
-    dynamic get(List<String> keyPrefixes,[Function responseFactory = null]) {
-      var params = new _Regression551GetParams();
-      params.keyPrefixes = keyPrefixes;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _regression551MethodGetName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-}
-
-
-class Regression551Proxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  Regression551 ptr;
-
-  Regression551Proxy(_Regression551ProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _Regression551ProxyCalls(proxyImpl);
-
+class Regression551Proxy extends bindings.Proxy
+                              implements Regression551 {
   Regression551Proxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _Regression551ProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _Regression551ProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _Regression551ProxyControl.fromEndpoint(endpoint));
 
-  Regression551Proxy.fromHandle(core.MojoHandle handle) :
-      impl = new _Regression551ProxyImpl.fromHandle(handle) {
-    ptr = new _Regression551ProxyCalls(impl);
-  }
+  Regression551Proxy.fromHandle(core.MojoHandle handle)
+      : super(new _Regression551ProxyControl.fromHandle(handle));
 
-  Regression551Proxy.unbound() :
-      impl = new _Regression551ProxyImpl.unbound() {
-    ptr = new _Regression551ProxyCalls(impl);
+  Regression551Proxy.unbound()
+      : super(new _Regression551ProxyControl.unbound());
+
+  static Regression551Proxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For Regression551Proxy"));
+    return new Regression551Proxy.fromEndpoint(endpoint);
   }
 
   factory Regression551Proxy.connectToService(
@@ -3018,30 +2845,15 @@
     return p;
   }
 
-  static Regression551Proxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For Regression551Proxy"));
-    return new Regression551Proxy.fromEndpoint(endpoint);
-  }
 
-  String get serviceName => Regression551.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "Regression551Proxy($impl)";
+  dynamic get(List<String> keyPrefixes,[Function responseFactory = null]) {
+    var params = new _Regression551GetParams();
+    params.keyPrefixes = keyPrefixes;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _regression551MethodGetName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
 }
 
@@ -3169,24 +2981,22 @@
 }
 
 
-class _ServiceNameProxyImpl extends bindings.Proxy {
-  _ServiceNameProxyImpl.fromEndpoint(
+class _ServiceNameProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _ServiceNameProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _ServiceNameProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _ServiceNameProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _ServiceNameProxyImpl.unbound() : super.unbound();
-
-  static _ServiceNameProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _ServiceNameProxyImpl"));
-    return new _ServiceNameProxyImpl.fromEndpoint(endpoint);
-  }
+  _ServiceNameProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _ServiceNameServiceDescription();
+      new _ServiceNameServiceDescription();
 
+  String get serviceName => ServiceName.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _serviceNameMethodServiceNameName:
@@ -3216,50 +3026,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_ServiceNameProxyImpl($superString)";
+    return "_ServiceNameProxyControl($superString)";
   }
 }
 
 
-class _ServiceNameProxyCalls implements ServiceName {
-  _ServiceNameProxyImpl _proxyImpl;
-
-  _ServiceNameProxyCalls(this._proxyImpl);
-    dynamic serviceName_([Function responseFactory = null]) {
-      var params = new _ServiceNameServiceNameParams();
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _serviceNameMethodServiceNameName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-}
-
-
-class ServiceNameProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  ServiceName ptr;
-
-  ServiceNameProxy(_ServiceNameProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _ServiceNameProxyCalls(proxyImpl);
-
+class ServiceNameProxy extends bindings.Proxy
+                              implements ServiceName {
   ServiceNameProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _ServiceNameProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _ServiceNameProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _ServiceNameProxyControl.fromEndpoint(endpoint));
 
-  ServiceNameProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _ServiceNameProxyImpl.fromHandle(handle) {
-    ptr = new _ServiceNameProxyCalls(impl);
-  }
+  ServiceNameProxy.fromHandle(core.MojoHandle handle)
+      : super(new _ServiceNameProxyControl.fromHandle(handle));
 
-  ServiceNameProxy.unbound() :
-      impl = new _ServiceNameProxyImpl.unbound() {
-    ptr = new _ServiceNameProxyCalls(impl);
+  ServiceNameProxy.unbound()
+      : super(new _ServiceNameProxyControl.unbound());
+
+  static ServiceNameProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ServiceNameProxy"));
+    return new ServiceNameProxy.fromEndpoint(endpoint);
   }
 
   factory ServiceNameProxy.connectToService(
@@ -3269,30 +3059,14 @@
     return p;
   }
 
-  static ServiceNameProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For ServiceNameProxy"));
-    return new ServiceNameProxy.fromEndpoint(endpoint);
-  }
 
-  String get serviceName => ServiceName.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "ServiceNameProxy($impl)";
+  dynamic serviceName_([Function responseFactory = null]) {
+    var params = new _ServiceNameServiceNameParams();
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _serviceNameMethodServiceNameName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
 }
 
@@ -3412,7 +3186,7 @@
   // serializedRuntimeTypeInfo contains the bytes of the Mojo serialization of
   // a mojom_types.RuntimeTypeInfo struct describing the Mojom types in this
   // file. The string contains the base64 encoding of the gzip-compressed bytes.
-  var serializedRuntimeTypeInfo = "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";
+  var serializedRuntimeTypeInfo = "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";
 
   // Deserialize RuntimeTypeInfo
   var bytes = BASE64.decode(serializedRuntimeTypeInfo);
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 46a28ba..59f7373 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
@@ -1103,24 +1103,22 @@
 }
 
 
-class _NamedObjectProxyImpl extends bindings.Proxy {
-  _NamedObjectProxyImpl.fromEndpoint(
+class _NamedObjectProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _NamedObjectProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _NamedObjectProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _NamedObjectProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _NamedObjectProxyImpl.unbound() : super.unbound();
-
-  static _NamedObjectProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _NamedObjectProxyImpl"));
-    return new _NamedObjectProxyImpl.fromEndpoint(endpoint);
-  }
+  _NamedObjectProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _NamedObjectServiceDescription();
+      new _NamedObjectServiceDescription();
 
+  String get serviceName => NamedObject.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _namedObjectMethodGetNameName:
@@ -1150,59 +1148,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_NamedObjectProxyImpl($superString)";
+    return "_NamedObjectProxyControl($superString)";
   }
 }
 
 
-class _NamedObjectProxyCalls implements NamedObject {
-  _NamedObjectProxyImpl _proxyImpl;
-
-  _NamedObjectProxyCalls(this._proxyImpl);
-    void setName(String name) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _NamedObjectSetNameParams();
-      params.name = name;
-      _proxyImpl.sendMessage(params, _namedObjectMethodSetNameName);
-    }
-    dynamic getName([Function responseFactory = null]) {
-      var params = new _NamedObjectGetNameParams();
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _namedObjectMethodGetNameName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-}
-
-
-class NamedObjectProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  NamedObject ptr;
-
-  NamedObjectProxy(_NamedObjectProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _NamedObjectProxyCalls(proxyImpl);
-
+class NamedObjectProxy extends bindings.Proxy
+                              implements NamedObject {
   NamedObjectProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _NamedObjectProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _NamedObjectProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _NamedObjectProxyControl.fromEndpoint(endpoint));
 
-  NamedObjectProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _NamedObjectProxyImpl.fromHandle(handle) {
-    ptr = new _NamedObjectProxyCalls(impl);
-  }
+  NamedObjectProxy.fromHandle(core.MojoHandle handle)
+      : super(new _NamedObjectProxyControl.fromHandle(handle));
 
-  NamedObjectProxy.unbound() :
-      impl = new _NamedObjectProxyImpl.unbound() {
-    ptr = new _NamedObjectProxyCalls(impl);
+  NamedObjectProxy.unbound()
+      : super(new _NamedObjectProxyControl.unbound());
+
+  static NamedObjectProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For NamedObjectProxy"));
+    return new NamedObjectProxy.fromEndpoint(endpoint);
   }
 
   factory NamedObjectProxy.connectToService(
@@ -1212,30 +1181,24 @@
     return p;
   }
 
-  static NamedObjectProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For NamedObjectProxy"));
-    return new NamedObjectProxy.fromEndpoint(endpoint);
+
+  void setName(String name) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _NamedObjectSetNameParams();
+    params.name = name;
+    ctrl.sendMessage(params,
+        _namedObjectMethodSetNameName);
   }
-
-  String get serviceName => NamedObject.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "NamedObjectProxy($impl)";
+  dynamic getName([Function responseFactory = null]) {
+    var params = new _NamedObjectGetNameParams();
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _namedObjectMethodGetNameName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
 }
 
@@ -1374,24 +1337,22 @@
 }
 
 
-class _FactoryProxyImpl extends bindings.Proxy {
-  _FactoryProxyImpl.fromEndpoint(
+class _FactoryProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _FactoryProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _FactoryProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _FactoryProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _FactoryProxyImpl.unbound() : super.unbound();
-
-  static _FactoryProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _FactoryProxyImpl"));
-    return new _FactoryProxyImpl.fromEndpoint(endpoint);
-  }
+  _FactoryProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _FactoryServiceDescription();
+      new _FactoryServiceDescription();
 
+  String get serviceName => Factory.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _factoryMethodDoStuffName:
@@ -1481,88 +1442,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_FactoryProxyImpl($superString)";
+    return "_FactoryProxyControl($superString)";
   }
 }
 
 
-class _FactoryProxyCalls implements Factory {
-  _FactoryProxyImpl _proxyImpl;
-
-  _FactoryProxyCalls(this._proxyImpl);
-    dynamic doStuff(Request request,core.MojoMessagePipeEndpoint pipe,[Function responseFactory = null]) {
-      var params = new _FactoryDoStuffParams();
-      params.request = request;
-      params.pipe = pipe;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _factoryMethodDoStuffName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    dynamic doStuff2(core.MojoDataPipeConsumer pipe,[Function responseFactory = null]) {
-      var params = new _FactoryDoStuff2Params();
-      params.pipe = pipe;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _factoryMethodDoStuff2Name,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    void createNamedObject(Object obj) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _FactoryCreateNamedObjectParams();
-      params.obj = obj;
-      _proxyImpl.sendMessage(params, _factoryMethodCreateNamedObjectName);
-    }
-    dynamic requestImportedInterface(Object obj,[Function responseFactory = null]) {
-      var params = new _FactoryRequestImportedInterfaceParams();
-      params.obj = obj;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _factoryMethodRequestImportedInterfaceName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    dynamic takeImportedInterface(Object obj,[Function responseFactory = null]) {
-      var params = new _FactoryTakeImportedInterfaceParams();
-      params.obj = obj;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _factoryMethodTakeImportedInterfaceName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-}
-
-
-class FactoryProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  Factory ptr;
-
-  FactoryProxy(_FactoryProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _FactoryProxyCalls(proxyImpl);
-
+class FactoryProxy extends bindings.Proxy
+                              implements Factory {
   FactoryProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _FactoryProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _FactoryProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _FactoryProxyControl.fromEndpoint(endpoint));
 
-  FactoryProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _FactoryProxyImpl.fromHandle(handle) {
-    ptr = new _FactoryProxyCalls(impl);
-  }
+  FactoryProxy.fromHandle(core.MojoHandle handle)
+      : super(new _FactoryProxyControl.fromHandle(handle));
 
-  FactoryProxy.unbound() :
-      impl = new _FactoryProxyImpl.unbound() {
-    ptr = new _FactoryProxyCalls(impl);
+  FactoryProxy.unbound()
+      : super(new _FactoryProxyControl.unbound());
+
+  static FactoryProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For FactoryProxy"));
+    return new FactoryProxy.fromEndpoint(endpoint);
   }
 
   factory FactoryProxy.connectToService(
@@ -1572,30 +1475,53 @@
     return p;
   }
 
-  static FactoryProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For FactoryProxy"));
-    return new FactoryProxy.fromEndpoint(endpoint);
+
+  dynamic doStuff(Request request,core.MojoMessagePipeEndpoint pipe,[Function responseFactory = null]) {
+    var params = new _FactoryDoStuffParams();
+    params.request = request;
+    params.pipe = pipe;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _factoryMethodDoStuffName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
-
-  String get serviceName => Factory.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
+  dynamic doStuff2(core.MojoDataPipeConsumer pipe,[Function responseFactory = null]) {
+    var params = new _FactoryDoStuff2Params();
+    params.pipe = pipe;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _factoryMethodDoStuff2Name,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
-
-  String toString() {
-    return "FactoryProxy($impl)";
+  void createNamedObject(Object obj) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _FactoryCreateNamedObjectParams();
+    params.obj = obj;
+    ctrl.sendMessage(params,
+        _factoryMethodCreateNamedObjectName);
+  }
+  dynamic requestImportedInterface(Object obj,[Function responseFactory = null]) {
+    var params = new _FactoryRequestImportedInterfaceParams();
+    params.obj = obj;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _factoryMethodRequestImportedInterfaceName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
+  }
+  dynamic takeImportedInterface(Object obj,[Function responseFactory = null]) {
+    var params = new _FactoryTakeImportedInterfaceParams();
+    params.obj = obj;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _factoryMethodTakeImportedInterfaceName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
 }
 
@@ -1804,7 +1730,7 @@
   // serializedRuntimeTypeInfo contains the bytes of the Mojo serialization of
   // a mojom_types.RuntimeTypeInfo struct describing the Mojom types in this
   // file. The string contains the base64 encoding of the gzip-compressed bytes.
-  var serializedRuntimeTypeInfo = "H4sIAAAJbogC/+xaSZPbRBTW4qmYJYknU8QiJDMekgyZohiZcMA1p1RBSFJUQQpzIMVhxkubaIgsIcmUuXHMT+DIkZ+QI8f8jBw55pgbtKzXdrvVrcXR5mBVdbWlkab7ff19771eNCm4GlA/hZp93qHuZVzqcP8BLju4uD3TfoKOj7/pmWj4bf8MDTzu+9fhm+8fPbx78vXdR8fBh0fsd2z7z6C+hUsNlxbTrx+gtqHew6XJaeer3sCznN8S90P0f75Dv0yQ6836oXH/7trW2EX3ob++HSqDo3//fG8ZV+1w+b6jL+yWKLvJ9ZK5v8Pctxmc/oWLfY9cF3E5hwvB6TL+fWE+vnP4QuOzj8vbuPyISxcX/bFlIt2ZDC3TGCNHN60zS3edQfDDnvSfGAPdGHvIGfUGyNX7xnhojH9ydQ+j6upBcyejoLkj/yOTywuCy1VctuC3j5sC+NYoHLao9x8CIf8+D/zZDurnTT7eL6Ce1pLhLVF40/9PhPeXVtebjEYh+z4EW/LGtcXonth7qia307/aAjubYCvY+YkD+mHtJVcRPFKodk/lZTtpnW5xdCa6suKDCB+fD5cK5IPEtK8x/SR+MM5P8nCtReBaXwFXOQLXd6E927ARz4/4uH5aAK4NykfJnPioUX1WqPu89alBXxb6DOLXRp9hHdRn+uTjcx3yobL1SfpJ8pC4POWOIM8rWp8emno8ffq43ihQn5Ig3xXpU5QvaOpC71ngRMYVdHqbxelGyfnCrPHs/dFtkjCU5Y9YHqSNZ1n7obh45vPgoGC9KDF6kan3Wf78Q/xKSv50BPi8j8v2Mn8CRyeY31aJR3IJPBL5XZ9Hn1fM78qc+V9LMB9WUuCkUOMg4tMXDup5iF0lCON2syQ/TOw/Takj0XrAPtgesns+g6u+norMD9+BdQerfybkxX6BvFCY9snzHegry+Sk62Kvq88/IS9SU+CuRuiT5Lcw33xg2pbjoeEDghw7Dgcl63OakT5vQRsiu9chb6qSPg8Kincifbap9YgruBgwoEehkQ3e+xg0O9drzAer5mevoP49JW/vC8bhEPxgBG/XJl+rEn8/Kijvrzp/4+JOLcV41CLizjVc3vP73/sZ8XrM2694E+LOTbCdazeVG250m0y3/neflbhuWNW4kzVvfd+4G8FbEnQ2vE3G20PwBf933rLxxoYF36cyfzzIeP4B9V8Mf59FrP/S/Wlx8qNznHleFzm/GoPZBD7RuQ3R/PAK7D8KpoUhflwt6FxAnD1axD6JQo0nu+/UUaPX9/Pa/+0ibzZWbL+vvSHr++Q8ANhZ+nmAqq7LjkGwPB5sr9G6LOHPKznb/TCil3sCveyWrJcXUrZ6uVcRvdQT8EGKiFN57Rcu8Cn3/MK6+ZNd4FhV/YloXvByKxqftOceyXkl5twjeRzC7Tx8lzdu7LnXFjjQNujnsSrmmSQtzkbmzbO3YNymgnW7CzDWeeOVdn++ltN5FtH+/EV4VvR5Mx4uCrW+m8U5H4XznFyXYD5gWg468cFx+Tzx670C47YMfSc8qXPihrzCfLyxAn7qa8zHd8CXF4lbVebjS/5REC9aajbxgj1fR/Iz5lhdaHwuFxQv2HlsQ16P+NDcxIc5LmXEh7jzjuT9/wIAAP//4cQFxDg0AAA=";
+  var serializedRuntimeTypeInfo = "H4sIAAAJbogC/+xaT3PbRBTXH4eaf6nTDI0oberQNrgwRKYcyOTUGShNhhnIEA7kQkZ21omDbQlJZgwnjjlyzEfgI+Rj8DFy5MgNVtFbe73alSxHltYZ78zOWooU7fu93/uzu89QwlaB8RxG9v42da3iXobrD3Bfxd2zuk4H7ex8a3XR8XeNM9T0uc8/gXd+ONx/dfTNq8Od8MUt9j32+5cw1nAv4V5l5vUjjA6Mj3Ff43zna6vp2+5vE89D9H++R7/0kedfz8Pg/t1z7J6HdmG+gRw6g2NwfVEdx7X28fi1Ux/JrVByk/Yvc/2Sua4zOP0HjX2OtLu438Gd4HQf/14e6ncIX0Q/G7i/hXsL959wN/uea3bsptUxT2z7pIPMU7uLzN9dy+zaZ7bpuc3wh9NvdNpNs93zkduymsgzG+3ecbt34pk+Btgzwy8ftcIvbwUvdaPfJ/g8xH0Jfgf4aYBzicJjiXr+HIhZXQ7Hv1fC8dTg434F40VpMtwVCnf6/4lw/8o+8PutVkS+D0GWvPCtMn6AyD3QJ5c3aHWBvGsgM8j7qQv2xMpNWp680qjvn6rj8tL2u8SxP1HLih8inAJ+3CuAHwozD4OZL/GTSX6Uh28pBt/yFPiqMfi+A99z2g7ixZ8A389yxLdC+TCVE0cNau4adT1ruzVgLiO7DePcwm75rQI6E+H0BPInWeyWzJfkL0n5zUtBfpi33fpo4PPsNsD3aQF2qwjyZZHdivKMuj7yA1ngRfQL9vuCxeupJHlGRZuJv3pBEo2i/RXLi7TxL2s/lRT/Al5sFmRHWoIdqdQ8WT79Q65T8mlbgNP7uK+M8yl0hIJ1s4y8Ugvglcg/B7z6QlL/rHLWl1XBultLgZdG6UPEry9dZPmI3Y2I4vesYH9NcHBS2pdo/2EDMIjIP1whzo+d5Zlnvg37HHbjTMiTjQJ4ojHzIPdXYc4swyfdl7up3V5CXqWnwF+PsVuSJ8N6dq/r2K6PjvcIbKw+NiWx2/OM7LYGGIjkn6e8Sya73cw5Porstk7tgzzAvQ0K3opoOnzuE7DloR0nvDBtfkcWRn+m5PGuQB/PwU/G8Hju8j2Z+PxRzusI2fmcFJ9KKfRSiolPj3B/L5i/9TPizZh3nnKb4tMzwIArP5VbLuw5nT0H730uwf6lrPEpax4HvnM9hsckOC14nI7Hz8FHLHjMj0sDkmepfL0QvV7A+BfD58uY/Wh6PlVOXnWHs248QO6v7eb1BsFEdSii9eYDODcVLDMjPHmYc51DklxGzDmORumVPR/b1+PPHWZ1fn2A/GudsfN+dMvOHUh9A8grTX2DrPvDPTBkHi9W5nB/mPCprGV7fkfs6LXAjtYlsaMrJVs7ei2ZHZUn4IcSE9dmdc45wkmOuox58zfrwDnZ/Y1onWG8EY9T2jpQUp/F1IGS2xH83oX38sKPrQeukbofsKs/dDHvFGVUKzpr3r0J+hsI9g2XQed54Za23qCUc73dXbhXVL0dDx+NDuQZ1DVpnPuk3YN1Rtd20VEAksfnTTA+LiDeqyAD4U2ZE2fUKdb9lSlw1G+w7l8Fn18EfrKs+2n/KYor23o2cYWtLyT5HVNWGNHT/ZzjCrteNtT5iCNrizgS2Q8pMo4k1X+S5/8PAAD//wmWKGaINQAA";
 
   // Deserialize RuntimeTypeInfo
   var bytes = BASE64.decode(serializedRuntimeTypeInfo);
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 59da5b9..64d2a7d 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
@@ -1373,24 +1373,22 @@
 }
 
 
-class _ProviderProxyImpl extends bindings.Proxy {
-  _ProviderProxyImpl.fromEndpoint(
+class _ProviderProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _ProviderProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _ProviderProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _ProviderProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _ProviderProxyImpl.unbound() : super.unbound();
-
-  static _ProviderProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _ProviderProxyImpl"));
-    return new _ProviderProxyImpl.fromEndpoint(endpoint);
-  }
+  _ProviderProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _ProviderServiceDescription();
+      new _ProviderServiceDescription();
 
+  String get serviceName => Provider.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _providerMethodEchoStringName:
@@ -1500,88 +1498,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_ProviderProxyImpl($superString)";
+    return "_ProviderProxyControl($superString)";
   }
 }
 
 
-class _ProviderProxyCalls implements Provider {
-  _ProviderProxyImpl _proxyImpl;
-
-  _ProviderProxyCalls(this._proxyImpl);
-    dynamic echoString(String a,[Function responseFactory = null]) {
-      var params = new _ProviderEchoStringParams();
-      params.a = a;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _providerMethodEchoStringName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    dynamic echoStrings(String a,String b,[Function responseFactory = null]) {
-      var params = new _ProviderEchoStringsParams();
-      params.a = a;
-      params.b = b;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _providerMethodEchoStringsName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    dynamic echoMessagePipeHandle(core.MojoMessagePipeEndpoint a,[Function responseFactory = null]) {
-      var params = new _ProviderEchoMessagePipeHandleParams();
-      params.a = a;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _providerMethodEchoMessagePipeHandleName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    dynamic echoEnum(Enum a,[Function responseFactory = null]) {
-      var params = new _ProviderEchoEnumParams();
-      params.a = a;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _providerMethodEchoEnumName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    dynamic echoInt(int a,[Function responseFactory = null]) {
-      var params = new _ProviderEchoIntParams();
-      params.a = a;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _providerMethodEchoIntName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-}
-
-
-class ProviderProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  Provider ptr;
-
-  ProviderProxy(_ProviderProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _ProviderProxyCalls(proxyImpl);
-
+class ProviderProxy extends bindings.Proxy
+                              implements Provider {
   ProviderProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _ProviderProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _ProviderProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _ProviderProxyControl.fromEndpoint(endpoint));
 
-  ProviderProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _ProviderProxyImpl.fromHandle(handle) {
-    ptr = new _ProviderProxyCalls(impl);
-  }
+  ProviderProxy.fromHandle(core.MojoHandle handle)
+      : super(new _ProviderProxyControl.fromHandle(handle));
 
-  ProviderProxy.unbound() :
-      impl = new _ProviderProxyImpl.unbound() {
-    ptr = new _ProviderProxyCalls(impl);
+  ProviderProxy.unbound()
+      : super(new _ProviderProxyControl.unbound());
+
+  static ProviderProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ProviderProxy"));
+    return new ProviderProxy.fromEndpoint(endpoint);
   }
 
   factory ProviderProxy.connectToService(
@@ -1591,30 +1531,52 @@
     return p;
   }
 
-  static ProviderProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For ProviderProxy"));
-    return new ProviderProxy.fromEndpoint(endpoint);
+
+  dynamic echoString(String a,[Function responseFactory = null]) {
+    var params = new _ProviderEchoStringParams();
+    params.a = a;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _providerMethodEchoStringName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
-
-  String get serviceName => Provider.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
+  dynamic echoStrings(String a,String b,[Function responseFactory = null]) {
+    var params = new _ProviderEchoStringsParams();
+    params.a = a;
+    params.b = b;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _providerMethodEchoStringsName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
-
-  String toString() {
-    return "ProviderProxy($impl)";
+  dynamic echoMessagePipeHandle(core.MojoMessagePipeEndpoint a,[Function responseFactory = null]) {
+    var params = new _ProviderEchoMessagePipeHandleParams();
+    params.a = a;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _providerMethodEchoMessagePipeHandleName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
+  }
+  dynamic echoEnum(Enum a,[Function responseFactory = null]) {
+    var params = new _ProviderEchoEnumParams();
+    params.a = a;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _providerMethodEchoEnumName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
+  }
+  dynamic echoInt(int a,[Function responseFactory = null]) {
+    var params = new _ProviderEchoIntParams();
+    params.a = a;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _providerMethodEchoIntName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
 }
 
@@ -1853,24 +1815,22 @@
 }
 
 
-class _IntegerAccessorProxyImpl extends bindings.Proxy {
-  _IntegerAccessorProxyImpl.fromEndpoint(
+class _IntegerAccessorProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _IntegerAccessorProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _IntegerAccessorProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _IntegerAccessorProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _IntegerAccessorProxyImpl.unbound() : super.unbound();
-
-  static _IntegerAccessorProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _IntegerAccessorProxyImpl"));
-    return new _IntegerAccessorProxyImpl.fromEndpoint(endpoint);
-  }
+  _IntegerAccessorProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _IntegerAccessorServiceDescription();
+      new _IntegerAccessorServiceDescription();
 
+  String get serviceName => IntegerAccessor.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _integerAccessorMethodGetIntegerName:
@@ -1900,60 +1860,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_IntegerAccessorProxyImpl($superString)";
+    return "_IntegerAccessorProxyControl($superString)";
   }
 }
 
 
-class _IntegerAccessorProxyCalls implements IntegerAccessor {
-  _IntegerAccessorProxyImpl _proxyImpl;
-
-  _IntegerAccessorProxyCalls(this._proxyImpl);
-    dynamic getInteger([Function responseFactory = null]) {
-      var params = new _IntegerAccessorGetIntegerParams();
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _integerAccessorMethodGetIntegerName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    void setInteger(int data, Enum type) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _IntegerAccessorSetIntegerParams();
-      params.data = data;
-      params.type = type;
-      _proxyImpl.sendMessage(params, _integerAccessorMethodSetIntegerName);
-    }
-}
-
-
-class IntegerAccessorProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  IntegerAccessor ptr;
-
-  IntegerAccessorProxy(_IntegerAccessorProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _IntegerAccessorProxyCalls(proxyImpl);
-
+class IntegerAccessorProxy extends bindings.Proxy
+                              implements IntegerAccessor {
   IntegerAccessorProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _IntegerAccessorProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _IntegerAccessorProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _IntegerAccessorProxyControl.fromEndpoint(endpoint));
 
-  IntegerAccessorProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _IntegerAccessorProxyImpl.fromHandle(handle) {
-    ptr = new _IntegerAccessorProxyCalls(impl);
-  }
+  IntegerAccessorProxy.fromHandle(core.MojoHandle handle)
+      : super(new _IntegerAccessorProxyControl.fromHandle(handle));
 
-  IntegerAccessorProxy.unbound() :
-      impl = new _IntegerAccessorProxyImpl.unbound() {
-    ptr = new _IntegerAccessorProxyCalls(impl);
+  IntegerAccessorProxy.unbound()
+      : super(new _IntegerAccessorProxyControl.unbound());
+
+  static IntegerAccessorProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For IntegerAccessorProxy"));
+    return new IntegerAccessorProxy.fromEndpoint(endpoint);
   }
 
   factory IntegerAccessorProxy.connectToService(
@@ -1963,30 +1893,25 @@
     return p;
   }
 
-  static IntegerAccessorProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For IntegerAccessorProxy"));
-    return new IntegerAccessorProxy.fromEndpoint(endpoint);
+
+  dynamic getInteger([Function responseFactory = null]) {
+    var params = new _IntegerAccessorGetIntegerParams();
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _integerAccessorMethodGetIntegerName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
-
-  String get serviceName => IntegerAccessor.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "IntegerAccessorProxy($impl)";
+  void setInteger(int data, Enum type) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _IntegerAccessorSetIntegerParams();
+    params.data = data;
+    params.type = type;
+    ctrl.sendMessage(params,
+        _integerAccessorMethodSetIntegerName);
   }
 }
 
@@ -2122,24 +2047,22 @@
 }
 
 
-class _SampleInterfaceProxyImpl extends bindings.Proxy {
-  _SampleInterfaceProxyImpl.fromEndpoint(
+class _SampleInterfaceProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _SampleInterfaceProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _SampleInterfaceProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _SampleInterfaceProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _SampleInterfaceProxyImpl.unbound() : super.unbound();
-
-  static _SampleInterfaceProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _SampleInterfaceProxyImpl"));
-    return new _SampleInterfaceProxyImpl.fromEndpoint(endpoint);
-  }
+  _SampleInterfaceProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _SampleInterfaceServiceDescription();
+      new _SampleInterfaceServiceDescription();
 
+  String get serviceName => SampleInterface.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _sampleInterfaceMethodSampleMethod1Name:
@@ -2169,68 +2092,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_SampleInterfaceProxyImpl($superString)";
+    return "_SampleInterfaceProxyControl($superString)";
   }
 }
 
 
-class _SampleInterfaceProxyCalls implements SampleInterface {
-  _SampleInterfaceProxyImpl _proxyImpl;
-
-  _SampleInterfaceProxyCalls(this._proxyImpl);
-    dynamic sampleMethod1(int in1,String in2,[Function responseFactory = null]) {
-      var params = new _SampleInterfaceSampleMethod1Params();
-      params.in1 = in1;
-      params.in2 = in2;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _sampleInterfaceMethodSampleMethod1Name,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    void sampleMethod0() {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _SampleInterfaceSampleMethod0Params();
-      _proxyImpl.sendMessage(params, _sampleInterfaceMethodSampleMethod0Name);
-    }
-    void sampleMethod2() {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _SampleInterfaceSampleMethod2Params();
-      _proxyImpl.sendMessage(params, _sampleInterfaceMethodSampleMethod2Name);
-    }
-}
-
-
-class SampleInterfaceProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  SampleInterface ptr;
-
-  SampleInterfaceProxy(_SampleInterfaceProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _SampleInterfaceProxyCalls(proxyImpl);
-
+class SampleInterfaceProxy extends bindings.Proxy
+                              implements SampleInterface {
   SampleInterfaceProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _SampleInterfaceProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _SampleInterfaceProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _SampleInterfaceProxyControl.fromEndpoint(endpoint));
 
-  SampleInterfaceProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _SampleInterfaceProxyImpl.fromHandle(handle) {
-    ptr = new _SampleInterfaceProxyCalls(impl);
-  }
+  SampleInterfaceProxy.fromHandle(core.MojoHandle handle)
+      : super(new _SampleInterfaceProxyControl.fromHandle(handle));
 
-  SampleInterfaceProxy.unbound() :
-      impl = new _SampleInterfaceProxyImpl.unbound() {
-    ptr = new _SampleInterfaceProxyCalls(impl);
+  SampleInterfaceProxy.unbound()
+      : super(new _SampleInterfaceProxyControl.unbound());
+
+  static SampleInterfaceProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For SampleInterfaceProxy"));
+    return new SampleInterfaceProxy.fromEndpoint(endpoint);
   }
 
   factory SampleInterfaceProxy.connectToService(
@@ -2240,30 +2125,34 @@
     return p;
   }
 
-  static SampleInterfaceProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For SampleInterfaceProxy"));
-    return new SampleInterfaceProxy.fromEndpoint(endpoint);
+
+  dynamic sampleMethod1(int in1,String in2,[Function responseFactory = null]) {
+    var params = new _SampleInterfaceSampleMethod1Params();
+    params.in1 = in1;
+    params.in2 = in2;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _sampleInterfaceMethodSampleMethod1Name,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
-
-  String get serviceName => SampleInterface.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
+  void sampleMethod0() {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _SampleInterfaceSampleMethod0Params();
+    ctrl.sendMessage(params,
+        _sampleInterfaceMethodSampleMethod0Name);
   }
-
-  String toString() {
-    return "SampleInterfaceProxy($impl)";
+  void sampleMethod2() {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _SampleInterfaceSampleMethod2Params();
+    ctrl.sendMessage(params,
+        _sampleInterfaceMethodSampleMethod2Name);
   }
 }
 
@@ -2392,7 +2281,7 @@
   // serializedRuntimeTypeInfo contains the bytes of the Mojo serialization of
   // a mojom_types.RuntimeTypeInfo struct describing the Mojom types in this
   // file. The string contains the base64 encoding of the gzip-compressed bytes.
-  var serializedRuntimeTypeInfo = "H4sIAAAJbogC/+xb3W7jRBT2xOkSdil0ty2k7F920UJu2qRFgoir9CIiFVSqVKjYG1ZpMjRGjR1sBy13PAqXPAaPwmUv9w1gvDmnGU9m/NM69qTbkUZT/2V8Pn/nOzNnplVjWtagbUIrnse2IrTiff9AW2e1zGoNjlvQ/gTtGNpHrG6w+sPLo86r7zovv/F6o/E53enYk1Fw/QtWn0quH9g+PaPufr9PPc9x3/ZTldx35Dq/WwPqqn7n+G0T/Jr7S69PjS6895rw3sGxyWq7FD6++DB8/OeOHJcLaNtGuDSFfv6DIt6H5QN4P8RnndV7rAqwzfUfPLfC6s+snrDaGDoj2nAnA2dk2dRtjJxfnYbn9qd/jCen51a/YSEsXuPUsgeWfeY1fOr5XmPa3avZDTvBc6Npf4TjRx3amhFdkuLSVTy/Cvad7H//Y4e1W6zeD+Oyg9dk+ATPl3LAR4kHmTZmDB5tAY8jBR6fsPoRq6KfPGHnPp7hIl6ewyU4vpsDLrJ+8bjEQVSFY7yvfkfOM/S3SikZzwwOV9l5LA8Aj2+pD9jJ+bSVE59qAl4XCfXGEHjUUtj7Kdg8s3fbpb9N2EvJ7cayaLsrXL9EEo8MIU6pcPrLzAanh6DFIZy8sWN7tFCcRH9ZI2F7W8J73TGSlaR+VI+JY4Oe31P5z1YO+MhwCOJIi8jfG/lUMuQ4vpbgQLjxjlhE/tYk+mdy/aH+HFr2CXU9y7HDePp/jKkKzy9z1CNDoefi+CVu/CfytybxcyLppwS1qhiHNMl8+CUpvufra35PEvM98fxxTJx5WHCcyUo/Mc4caxZnllU/MR7pqp9mzvppXlM/Azy33yH9NGP0E8ubK87j2hHfM/iWOG/HeYwwnZfmJ4qYp9S5PMYKh2cJMCxzOKxw9/8NNw9X4cQ64FmNns/UzcXMZzr9oXPsuwwCud7eLzjO4Dwuqzgzs1ePOCPqmExXicTfFhVf3of+eoaaDxs54RKl9yodWzSPML6GeKTBfG8ZefRcYx6pdLhbDqXtEuFEInQY87gzPnlSvB4UrMN1c1H+44WEWJfxfo0shx8FvNgswI/S4lK5Ai4kAS6nEbg81Uxf+HH1ov0M5wdhP5sFqls/S+9n27d+JsXla439TIzjiFvLlOdzo3Aqcd9BLI9BhwN/O6Se1zujR9aYdnv24JxKcFsvKJ6j/Wspx8OqefsLsF1qNxfZdR4XlzXSmfUCdIZcY36VNZ8+Z/VJBJ8wgt3yKTmfDjTmk6jP/+J+ITPZvggeJzMCJ8wvBrwKcqQiThsF6THa207pP6r5ZBVsQjtRgnX2lxWN/GUD/l62fP9182PdjPJjuP+K4x+XHdNbt3Xj4aMbzEOV7ldA8MspcC5H4BysIb0HfDyw/TmcNwvW/TckG93H9TKw83LkrbO/GdzaWdH+tpmT7l9Vp7PmCz9OmPJlKtO3fEnOl8ca8SVuf3EcLm2BN3H7i8X988L+YvHyHH61gtbta1x8NYV1e7xucjg34ULtbvS6UFr+Yb8q/wz4tXqJ8yH1h86gKeHhc+Nm7DfG/FnIXg3yR2n3G6v40Uq5bkgieKPix64Ep2cF86NqLo4fuxrwI+0+wbzi1z3QMcvelcavZ3CuiH2Cea5fzHDYU+LwIsf8GMlonXCYkV9h3Bb9qug8q67rhDgfdib+ropPXxXAp7T5jKz9jMNlT4XL/g3LZ0StM4rjwqTrjPj/C2ni/p4E789u8LhwbwnHhf8HAAD//+5ePoRwPQAA";
+  var serializedRuntimeTypeInfo = "H4sIAAAJbogC/+xb3W7jRBS243Qpuyx0tymk+5tdtJCb1kmRoOIqvYhIBZUiFVbdq103GRKjxA62gwpPwCPwCFzyCDwCj8Jl78BuzmnGkxn/JE4zbjvS0dR/Gc/n73xn5sy0rEzKBtQ1qNnzWK8zNXvf31BXfSv6VoHjfahPoB5B/cS3km/fv2k3337bfPO1awxHA7LbtMbD4Prnvj3nXD+0PNIjzkGnQ1zXdi7aKXPuazv2L2aXOKLfOb6ogl9zfjQ6RGnBe28w7x0ca769K4SP//wofKzU+bicQ91QwqXGtPMfFPY+LB/A+yE+m77d842Bbab94Lk130zfDN/0sevoA7tjDPSebfcGRO/bQ6L/5hj60P7J1l2nM/ljND4dmB3dRIRc/dS0uqbVc3WPuJ6rT1p+O71hN3huSLWvUnypQl1RoktSnFqC5+9Df18ffPdD06+3fXsQxmkXr/HwCp4vrAAvET4b6qTWYvBpMPi0Bfh84ltAXdaPnvnnPp7ixF6ewSk4vrsCnHjvgcfgohe8K8Mx3nd2h48z+me1kIyHCoUz7zyWh4DPN8QDLPnvv70ivlUY/M4T6pXC8Gxf0P9HgMG0/zsO+XnsvxkfByxXjcO6QK/KzHutx+D2j5YNbo9B20O4uSPbcolUuLH+VVHD/d9n3vOOkqwk9btqTJzsGp4h8rftFeDFwyWIUy2V3w/kW0Hw/BkHF5UaX7GF5XeFo58a1R7q15FpvSaOa9pWGF/v1xER4fvFCvVMEcQHdvwUN/6c4TdHF1ROOwWwsiCuN5jvrYIl/b5nC35fNeb74vnjmLj1WLK4lZX+Ytw6ljxu5VV/Mb7lRX+1K9ZfbUH9DfDducH6q8Xob+jhOeadjYjvG3xbzDvgPItJR3DzKzLMo6pUXmaNgqgAmBYpXNao+8/h5uqH8HulSd1+FD3fOtGWM99qdvr2sef4OPD7+UCyuIXzzqzi1rT/csYtVgd5uqxy/HNZ8ep9aMpQxHwprQinqPgh0sFl8wzjd4hnEs5P88izlznimUjXfy+Gw2sS3NQIXcc895RvLhe/h5Lp+om2LH9zQ8Iu63ykpubD7wLebEngd2lxWp8DJzUBTqcROD2XXJ/ocf+y/RLnL2G/nAbCW79c3C93bv0ykV9+lSO/nJmPA459jZ/vjsKtQH0XtjwFXQ/884i4rtEjbXNEWobVHRAOjpuSjB8Qj1rK8booL/EKsODiQI0k8jRuL0qkU5sS6JS6wPwwa7595tuzCL5hhLzl2/x8O8wR31i9/xfniVqyfS00bloEbph/DXgX5JBZ3EqS6Dv2/11KfxPNj8vQR+w3Snqe/GtNIv8qwd95Xz9ZNF/YzyhfiPvvKH5S2cJ8xQHZePrkBvFUFEf2IYAUU+BejMA9WLN7D/h6aHkzuG9JFkc2MoojuF4J/b6cGeTJPxVq7XLV/rm1ojgyr+5nzSd6XDLh00T2b/k0P5+eSsynuP3rcTg1GF7F7V9n/3+D2b/OXp7BsyLJvosKFc81Zt8FXteo59pw4a+70etwafmJ7Yr8OeDf/Uvcj4jXt7s1Tn9eKtdzPzvmE0P9lzB/lnY/u4g/ZynXcdUIXon4U+fg9kIy/rS05fGnLiF/0u4rvar4eA900LTqXB19Aedk2Fd6letDU1z2hLi8WmG+UM1o3faPjPwQxwmsH8qWl5Z13Rbn9/bYq4v49qUEfEubv8naLymc9kQ4HVzz/E3Uui87Tk267ov/X5NmnLHHwf/TGzRO3bsG49T/AwAA//9GparmsEAAAA==";
 
   // Deserialize RuntimeTypeInfo
   var bytes = BASE64.decode(serializedRuntimeTypeInfo);
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 c99caf0..cebd725 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
@@ -1762,24 +1762,22 @@
 }
 
 
-class _ServiceProxyImpl extends bindings.Proxy {
-  _ServiceProxyImpl.fromEndpoint(
+class _ServiceProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _ServiceProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _ServiceProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _ServiceProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _ServiceProxyImpl.unbound() : super.unbound();
-
-  static _ServiceProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _ServiceProxyImpl"));
-    return new _ServiceProxyImpl.fromEndpoint(endpoint);
-  }
+  _ServiceProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _ServiceServiceDescription();
+      new _ServiceServiceDescription();
 
+  String get serviceName => Service.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _serviceMethodFrobinateName:
@@ -1809,62 +1807,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_ServiceProxyImpl($superString)";
+    return "_ServiceProxyControl($superString)";
   }
 }
 
 
-class _ServiceProxyCalls implements Service {
-  _ServiceProxyImpl _proxyImpl;
-
-  _ServiceProxyCalls(this._proxyImpl);
-    dynamic frobinate(Foo foo,ServiceBazOptions baz,Object port,[Function responseFactory = null]) {
-      var params = new _ServiceFrobinateParams();
-      params.foo = foo;
-      params.baz = baz;
-      params.port = port;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _serviceMethodFrobinateName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    void getPort(Object port) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _ServiceGetPortParams();
-      params.port = port;
-      _proxyImpl.sendMessage(params, _serviceMethodGetPortName);
-    }
-}
-
-
-class ServiceProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  Service ptr;
-
-  ServiceProxy(_ServiceProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _ServiceProxyCalls(proxyImpl);
-
+class ServiceProxy extends bindings.Proxy
+                              implements Service {
   ServiceProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _ServiceProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _ServiceProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _ServiceProxyControl.fromEndpoint(endpoint));
 
-  ServiceProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _ServiceProxyImpl.fromHandle(handle) {
-    ptr = new _ServiceProxyCalls(impl);
-  }
+  ServiceProxy.fromHandle(core.MojoHandle handle)
+      : super(new _ServiceProxyControl.fromHandle(handle));
 
-  ServiceProxy.unbound() :
-      impl = new _ServiceProxyImpl.unbound() {
-    ptr = new _ServiceProxyCalls(impl);
+  ServiceProxy.unbound()
+      : super(new _ServiceProxyControl.unbound());
+
+  static ServiceProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ServiceProxy"));
+    return new ServiceProxy.fromEndpoint(endpoint);
   }
 
   factory ServiceProxy.connectToService(
@@ -1874,30 +1840,27 @@
     return p;
   }
 
-  static ServiceProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For ServiceProxy"));
-    return new ServiceProxy.fromEndpoint(endpoint);
+
+  dynamic frobinate(Foo foo,ServiceBazOptions baz,Object port,[Function responseFactory = null]) {
+    var params = new _ServiceFrobinateParams();
+    params.foo = foo;
+    params.baz = baz;
+    params.port = port;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _serviceMethodFrobinateName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
-
-  String get serviceName => Service.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "ServiceProxy($impl)";
+  void getPort(Object port) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _ServiceGetPortParams();
+    params.port = port;
+    ctrl.sendMessage(params,
+        _serviceMethodGetPortName);
   }
 }
 
@@ -2030,24 +1993,22 @@
 }
 
 
-class _PortProxyImpl extends bindings.Proxy {
-  _PortProxyImpl.fromEndpoint(
+class _PortProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _PortProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _PortProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _PortProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _PortProxyImpl.unbound() : super.unbound();
-
-  static _PortProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _PortProxyImpl"));
-    return new _PortProxyImpl.fromEndpoint(endpoint);
-  }
+  _PortProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _PortServiceDescription();
+      new _PortServiceDescription();
 
+  String get serviceName => Port.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -2057,52 +2018,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_PortProxyImpl($superString)";
+    return "_PortProxyControl($superString)";
   }
 }
 
 
-class _PortProxyCalls implements Port {
-  _PortProxyImpl _proxyImpl;
-
-  _PortProxyCalls(this._proxyImpl);
-    void postMessage(String messageText, Object port) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _PortPostMessageParams();
-      params.messageText = messageText;
-      params.port = port;
-      _proxyImpl.sendMessage(params, _portMethodPostMessageName);
-    }
-}
-
-
-class PortProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  Port ptr;
-
-  PortProxy(_PortProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _PortProxyCalls(proxyImpl);
-
+class PortProxy extends bindings.Proxy
+                              implements Port {
   PortProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _PortProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _PortProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _PortProxyControl.fromEndpoint(endpoint));
 
-  PortProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _PortProxyImpl.fromHandle(handle) {
-    ptr = new _PortProxyCalls(impl);
-  }
+  PortProxy.fromHandle(core.MojoHandle handle)
+      : super(new _PortProxyControl.fromHandle(handle));
 
-  PortProxy.unbound() :
-      impl = new _PortProxyImpl.unbound() {
-    ptr = new _PortProxyCalls(impl);
+  PortProxy.unbound()
+      : super(new _PortProxyControl.unbound());
+
+  static PortProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For PortProxy"));
+    return new PortProxy.fromEndpoint(endpoint);
   }
 
   factory PortProxy.connectToService(
@@ -2112,30 +2051,17 @@
     return p;
   }
 
-  static PortProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For PortProxy"));
-    return new PortProxy.fromEndpoint(endpoint);
-  }
 
-  String get serviceName => Port.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "PortProxy($impl)";
+  void postMessage(String messageText, Object port) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _PortPostMessageParams();
+    params.messageText = messageText;
+    params.port = port;
+    ctrl.sendMessage(params,
+        _portMethodPostMessageName);
   }
 }
 
@@ -2235,7 +2161,7 @@
   // serializedRuntimeTypeInfo contains the bytes of the Mojo serialization of
   // a mojom_types.RuntimeTypeInfo struct describing the Mojom types in this
   // file. The string contains the base64 encoding of the gzip-compressed bytes.
-  var serializedRuntimeTypeInfo = "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";
+  var serializedRuntimeTypeInfo = "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";
 
   // Deserialize RuntimeTypeInfo
   var bytes = BASE64.decode(serializedRuntimeTypeInfo);
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 2c539f4..c88ac53 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
@@ -460,24 +460,22 @@
 }
 
 
-class _EchoServiceProxyImpl extends bindings.Proxy {
-  _EchoServiceProxyImpl.fromEndpoint(
+class _EchoServiceProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _EchoServiceProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _EchoServiceProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _EchoServiceProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _EchoServiceProxyImpl.unbound() : super.unbound();
-
-  static _EchoServiceProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _EchoServiceProxyImpl"));
-    return new _EchoServiceProxyImpl.fromEndpoint(endpoint);
-  }
+  _EchoServiceProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _EchoServiceServiceDescription();
+      new _EchoServiceServiceDescription();
 
+  String get serviceName => EchoService.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _echoServiceMethodEchoStringName:
@@ -527,77 +525,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_EchoServiceProxyImpl($superString)";
+    return "_EchoServiceProxyControl($superString)";
   }
 }
 
 
-class _EchoServiceProxyCalls implements EchoService {
-  _EchoServiceProxyImpl _proxyImpl;
-
-  _EchoServiceProxyCalls(this._proxyImpl);
-    dynamic echoString(String value,[Function responseFactory = null]) {
-      var params = new _EchoServiceEchoStringParams();
-      params.value = value;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _echoServiceMethodEchoStringName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    dynamic delayedEchoString(String value,int millis,[Function responseFactory = null]) {
-      var params = new _EchoServiceDelayedEchoStringParams();
-      params.value = value;
-      params.millis = millis;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _echoServiceMethodDelayedEchoStringName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    void swap() {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _EchoServiceSwapParams();
-      _proxyImpl.sendMessage(params, _echoServiceMethodSwapName);
-    }
-    void quit() {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _EchoServiceQuitParams();
-      _proxyImpl.sendMessage(params, _echoServiceMethodQuitName);
-    }
-}
-
-
-class EchoServiceProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  EchoService ptr;
-
-  EchoServiceProxy(_EchoServiceProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _EchoServiceProxyCalls(proxyImpl);
-
+class EchoServiceProxy extends bindings.Proxy
+                              implements EchoService {
   EchoServiceProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _EchoServiceProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _EchoServiceProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _EchoServiceProxyControl.fromEndpoint(endpoint));
 
-  EchoServiceProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _EchoServiceProxyImpl.fromHandle(handle) {
-    ptr = new _EchoServiceProxyCalls(impl);
-  }
+  EchoServiceProxy.fromHandle(core.MojoHandle handle)
+      : super(new _EchoServiceProxyControl.fromHandle(handle));
 
-  EchoServiceProxy.unbound() :
-      impl = new _EchoServiceProxyImpl.unbound() {
-    ptr = new _EchoServiceProxyCalls(impl);
+  EchoServiceProxy.unbound()
+      : super(new _EchoServiceProxyControl.unbound());
+
+  static EchoServiceProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For EchoServiceProxy"));
+    return new EchoServiceProxy.fromEndpoint(endpoint);
   }
 
   factory EchoServiceProxy.connectToService(
@@ -607,30 +558,43 @@
     return p;
   }
 
-  static EchoServiceProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For EchoServiceProxy"));
-    return new EchoServiceProxy.fromEndpoint(endpoint);
+
+  dynamic echoString(String value,[Function responseFactory = null]) {
+    var params = new _EchoServiceEchoStringParams();
+    params.value = value;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _echoServiceMethodEchoStringName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
-
-  String get serviceName => EchoService.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
+  dynamic delayedEchoString(String value,int millis,[Function responseFactory = null]) {
+    var params = new _EchoServiceDelayedEchoStringParams();
+    params.value = value;
+    params.millis = millis;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _echoServiceMethodDelayedEchoStringName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
-
-  String toString() {
-    return "EchoServiceProxy($impl)";
+  void swap() {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _EchoServiceSwapParams();
+    ctrl.sendMessage(params,
+        _echoServiceMethodSwapName);
+  }
+  void quit() {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _EchoServiceQuitParams();
+    ctrl.sendMessage(params,
+        _echoServiceMethodQuitName);
   }
 }
 
@@ -785,7 +749,7 @@
   // serializedRuntimeTypeInfo contains the bytes of the Mojo serialization of
   // a mojom_types.RuntimeTypeInfo struct describing the Mojom types in this
   // file. The string contains the base64 encoding of the gzip-compressed bytes.
-  var serializedRuntimeTypeInfo = "H4sIAAAJbogC/+xYS28TMRDeR4HQBlReUngcAqdwoOZYRULKgUiVkFBRuVQcolViyKLsA3u3iBtHfgJHjhz5ST1y5B+AzY7BmdiRFzUsQRlpOvE2s/b3+ZvxbjpeZbsQP0DE1/e1sS+8BeObwq8ILygv+v3heJodUXYSj6nl+3ch5/nx4XD0ZHjcl4l7i3l4/sEZ3M+H/FDL70HsQpz6VXwP0UPzKx4+QvwM8TvYF89seN1dA84L2vVrwneEA4qnUUKd+FZ5+D8dmAPTg3mW69sW/kLOLZxMs4QSVk6yJE4pI0n2OiOcjasPk4gVJMpzeVdO5N+RGHESpwVlL6Mx5YSKuUa8mmxPJiVOOPC6dL624LPkM4D97MF19b1P56p40K7i4WXzfn9VOgjN+63sIRrLvTZdV3YVePyJrGBx+sqM6yJgWDXfWG8Kdytwxytt34L3FmD+jfcBo29KsUIzbmWrxo3rbmDpZ988N3PVRc+Sf0m4lOZJNCupRQ83/hIvqoZMPHW0NfuWOlyFjm5DD5vTEc+zlNONjmrqqPcP6wj3YcXbwdb8/Vx48rV9wKbOmcd0Fr2jE9yOF3jbbqgfK/zdsF4dDSy41XPRAu75ttxYPXWA5199xV+PupL6uNNAXZl48WCtJmv9AS/+El7k49N54Uk8m8XczMv9Bvqw3l8CbWyrr93gbOrrHjzzmOpLO64251WNunq0RufVKcIX1OApWMJTG95jjt5GuUk/Ow2dT6coutaP7f3oOmCVOPUjqal6aTnowVvyuwHWQ1iDp9BBD8/K2MhP+z/Tg8S5jnr4EQAA//+qos9XSBMAAA==";
+  var serializedRuntimeTypeInfo = "H4sIAAAJbogC/+xYvY4TMRDenwPCXUD8SstPEahCwZkyioSUglRICHQ01xBZe75k0W52WW8OwRPwCJSUlJQ8Ao9yJSUd2OwYnIkdNtGR1Z5upLmJfZnY3+dvxpsETmlXIH6AiOd72tgV3oLxLeFXhReMF/3+MJykeyw/ikJmef89yHm5/3w4ejrc78vE3cU8vP7gBD7PhXxfy+9C7EDMXOABooPWVzx8hPgZ4k+wL47Z8L47BpwXtPnrwneEA4pnNGGV+FZ5+D8BrIHpwTzL/W0LPxT+SjiZ8ZzEaUhjMk7TcczIJE0YeZ9TkqSvU8LzsHxxQPOC0CyTC3Ai/47EiJNoWrD8kIaMEyaWHfFy3V2ZlPwbD96fztsWvJa8enCuXZhX7/t2royf2mX8etl87t/VOfvmc1f2CI3lmZvmlV0DPn8jK/JoOjbjuggYNsU71p/CH3jVcUvrWXDfBux/cT/M2ZuZ2J4Zv7JN4cf1OLD0uR9ONauqk64l/5JwKdUjGs+YRR83N8yPqi1T/wq0vbuW+vwfuroDPW5OVzxLp5yd6WpNXXUboCvcrxV/k635z6vCl6udBzZ1Hz1hMX3HDnDbXuBvu+a+rXjo+avV18CCXz1PLeCfb9+111kAvP/Rh9uMepN6uVtjvZn4cWDPJmutwY+7hB/5+HVeeBLFccTN/DyosV/r/cfTxra663gnU3f34ZnJVHfa9XZ2v61Rb48beL8dI5zeCnx5S/hqw/ejvbc0M+lpp+b77BjFqnVl+/51AzBLvPoVVncdtSrow1nyOwXWh78CX34FfbyYRUae2qdUHxJvk/XxKwAA///0GO/NyBMAAA==";
 
   // Deserialize RuntimeTypeInfo
   var bytes = BASE64.decode(serializedRuntimeTypeInfo);
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 2ca1bab..425f5fb 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
@@ -777,24 +777,22 @@
 }
 
 
-class _PingPongServiceProxyImpl extends bindings.Proxy {
-  _PingPongServiceProxyImpl.fromEndpoint(
+class _PingPongServiceProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _PingPongServiceProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _PingPongServiceProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _PingPongServiceProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _PingPongServiceProxyImpl.unbound() : super.unbound();
-
-  static _PingPongServiceProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _PingPongServiceProxyImpl"));
-    return new _PingPongServiceProxyImpl.fromEndpoint(endpoint);
-  }
+  _PingPongServiceProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _PingPongServiceServiceDescription();
+      new _PingPongServiceServiceDescription();
 
+  String get serviceName => PingPongService.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _pingPongServiceMethodPingTargetUrlName:
@@ -844,106 +842,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_PingPongServiceProxyImpl($superString)";
+    return "_PingPongServiceProxyControl($superString)";
   }
 }
 
 
-class _PingPongServiceProxyCalls implements PingPongService {
-  _PingPongServiceProxyImpl _proxyImpl;
-
-  _PingPongServiceProxyCalls(this._proxyImpl);
-    void setClient(Object client) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _PingPongServiceSetClientParams();
-      params.client = client;
-      _proxyImpl.sendMessage(params, _pingPongServiceMethodSetClientName);
-    }
-    void ping(int pingValue) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _PingPongServicePingParams();
-      params.pingValue = pingValue;
-      _proxyImpl.sendMessage(params, _pingPongServiceMethodPingName);
-    }
-    dynamic pingTargetUrl(String url,int count,[Function responseFactory = null]) {
-      var params = new _PingPongServicePingTargetUrlParams();
-      params.url = url;
-      params.count = count;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _pingPongServiceMethodPingTargetUrlName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    dynamic pingTargetService(Object service,int count,[Function responseFactory = null]) {
-      var params = new _PingPongServicePingTargetServiceParams();
-      params.service = service;
-      params.count = count;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _pingPongServiceMethodPingTargetServiceName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    void getPingPongService(Object service) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _PingPongServiceGetPingPongServiceParams();
-      params.service = service;
-      _proxyImpl.sendMessage(params, _pingPongServiceMethodGetPingPongServiceName);
-    }
-    void getPingPongServiceDelayed(Object service) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _PingPongServiceGetPingPongServiceDelayedParams();
-      params.service = service;
-      _proxyImpl.sendMessage(params, _pingPongServiceMethodGetPingPongServiceDelayedName);
-    }
-    void quit() {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _PingPongServiceQuitParams();
-      _proxyImpl.sendMessage(params, _pingPongServiceMethodQuitName);
-    }
-}
-
-
-class PingPongServiceProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  PingPongService ptr;
-
-  PingPongServiceProxy(_PingPongServiceProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _PingPongServiceProxyCalls(proxyImpl);
-
+class PingPongServiceProxy extends bindings.Proxy
+                              implements PingPongService {
   PingPongServiceProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _PingPongServiceProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _PingPongServiceProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _PingPongServiceProxyControl.fromEndpoint(endpoint));
 
-  PingPongServiceProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _PingPongServiceProxyImpl.fromHandle(handle) {
-    ptr = new _PingPongServiceProxyCalls(impl);
-  }
+  PingPongServiceProxy.fromHandle(core.MojoHandle handle)
+      : super(new _PingPongServiceProxyControl.fromHandle(handle));
 
-  PingPongServiceProxy.unbound() :
-      impl = new _PingPongServiceProxyImpl.unbound() {
-    ptr = new _PingPongServiceProxyCalls(impl);
+  PingPongServiceProxy.unbound()
+      : super(new _PingPongServiceProxyControl.unbound());
+
+  static PingPongServiceProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For PingPongServiceProxy"));
+    return new PingPongServiceProxy.fromEndpoint(endpoint);
   }
 
   factory PingPongServiceProxy.connectToService(
@@ -953,30 +875,75 @@
     return p;
   }
 
-  static PingPongServiceProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For PingPongServiceProxy"));
-    return new PingPongServiceProxy.fromEndpoint(endpoint);
+
+  void setClient(Object client) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _PingPongServiceSetClientParams();
+    params.client = client;
+    ctrl.sendMessage(params,
+        _pingPongServiceMethodSetClientName);
   }
-
-  String get serviceName => PingPongService.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
+  void ping(int pingValue) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _PingPongServicePingParams();
+    params.pingValue = pingValue;
+    ctrl.sendMessage(params,
+        _pingPongServiceMethodPingName);
   }
-
-  String toString() {
-    return "PingPongServiceProxy($impl)";
+  dynamic pingTargetUrl(String url,int count,[Function responseFactory = null]) {
+    var params = new _PingPongServicePingTargetUrlParams();
+    params.url = url;
+    params.count = count;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _pingPongServiceMethodPingTargetUrlName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
+  }
+  dynamic pingTargetService(Object service,int count,[Function responseFactory = null]) {
+    var params = new _PingPongServicePingTargetServiceParams();
+    params.service = service;
+    params.count = count;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _pingPongServiceMethodPingTargetServiceName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
+  }
+  void getPingPongService(Object service) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _PingPongServiceGetPingPongServiceParams();
+    params.service = service;
+    ctrl.sendMessage(params,
+        _pingPongServiceMethodGetPingPongServiceName);
+  }
+  void getPingPongServiceDelayed(Object service) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _PingPongServiceGetPingPongServiceDelayedParams();
+    params.service = service;
+    ctrl.sendMessage(params,
+        _pingPongServiceMethodGetPingPongServiceDelayedName);
+  }
+  void quit() {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _PingPongServiceQuitParams();
+    ctrl.sendMessage(params,
+        _pingPongServiceMethodQuitName);
   }
 }
 
@@ -1154,24 +1121,22 @@
 }
 
 
-class _PingPongClientProxyImpl extends bindings.Proxy {
-  _PingPongClientProxyImpl.fromEndpoint(
+class _PingPongClientProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _PingPongClientProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _PingPongClientProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _PingPongClientProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _PingPongClientProxyImpl.unbound() : super.unbound();
-
-  static _PingPongClientProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _PingPongClientProxyImpl"));
-    return new _PingPongClientProxyImpl.fromEndpoint(endpoint);
-  }
+  _PingPongClientProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _PingPongClientServiceDescription();
+      new _PingPongClientServiceDescription();
 
+  String get serviceName => PingPongClient.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -1181,51 +1146,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_PingPongClientProxyImpl($superString)";
+    return "_PingPongClientProxyControl($superString)";
   }
 }
 
 
-class _PingPongClientProxyCalls implements PingPongClient {
-  _PingPongClientProxyImpl _proxyImpl;
-
-  _PingPongClientProxyCalls(this._proxyImpl);
-    void pong(int pongValue) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _PingPongClientPongParams();
-      params.pongValue = pongValue;
-      _proxyImpl.sendMessage(params, _pingPongClientMethodPongName);
-    }
-}
-
-
-class PingPongClientProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  PingPongClient ptr;
-
-  PingPongClientProxy(_PingPongClientProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _PingPongClientProxyCalls(proxyImpl);
-
+class PingPongClientProxy extends bindings.Proxy
+                              implements PingPongClient {
   PingPongClientProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _PingPongClientProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _PingPongClientProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _PingPongClientProxyControl.fromEndpoint(endpoint));
 
-  PingPongClientProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _PingPongClientProxyImpl.fromHandle(handle) {
-    ptr = new _PingPongClientProxyCalls(impl);
-  }
+  PingPongClientProxy.fromHandle(core.MojoHandle handle)
+      : super(new _PingPongClientProxyControl.fromHandle(handle));
 
-  PingPongClientProxy.unbound() :
-      impl = new _PingPongClientProxyImpl.unbound() {
-    ptr = new _PingPongClientProxyCalls(impl);
+  PingPongClientProxy.unbound()
+      : super(new _PingPongClientProxyControl.unbound());
+
+  static PingPongClientProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For PingPongClientProxy"));
+    return new PingPongClientProxy.fromEndpoint(endpoint);
   }
 
   factory PingPongClientProxy.connectToService(
@@ -1235,30 +1179,16 @@
     return p;
   }
 
-  static PingPongClientProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For PingPongClientProxy"));
-    return new PingPongClientProxy.fromEndpoint(endpoint);
-  }
 
-  String get serviceName => PingPongClient.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "PingPongClientProxy($impl)";
+  void pong(int pongValue) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _PingPongClientPongParams();
+    params.pongValue = pongValue;
+    ctrl.sendMessage(params,
+        _pingPongClientMethodPongName);
   }
 }
 
@@ -1358,7 +1288,7 @@
   // serializedRuntimeTypeInfo contains the bytes of the Mojo serialization of
   // a mojom_types.RuntimeTypeInfo struct describing the Mojom types in this
   // file. The string contains the base64 encoding of the gzip-compressed bytes.
-  var serializedRuntimeTypeInfo = "H4sIAAAJbogC/+xZTU/bTBB2HD7ywhs+3hdKSigKlFb0AEZqD4gTUkFFalWlLVXLKVhhC26T2LUdpN565CfwE/oTeuxP4dgjR27tLpltl/VOYkeJbVpWGsyuP3bn2Zl5ZicFrdUm4HoCV3l8XehnqOSgf4fKNBWfeP7GRtlqHJbtxuEr4h5bVaJ4/h68s7tX3q483d7bYC+uBt+T53eEdenC+Bpcl6jMod99XLNIw48y/7IwT1ZaD+t/Hmj1l2G8pEktc7W7Kd1ek8Z/QCtr6naLyhgVWaMiHfsf8FeoG8BxgcoIlQqVN1SMI7tODLd5YNetBnGNuv3eNjy32vrnwHR9w3Qc9nXPYH8rtOcZVsMn7juzSjzDoXM6dM6K18Julb1YD8zL+/9K0Mj2IeN5huCB4akJeIrfkxtbB9tCBpcKp0XY/37jVJLw4fpeZMLrydoaoucU6Mr0XHHJxyZdm0pf3vqtr7zfm4r4ogn3O7WwdoDh8x/4w+VSj81ak6jj3yL4X9z4FKSQMoH4iQP2coLEHY7vKVy/SPbzFcFHXk9JwQ/DwjiLRaNUIJI+N+skFE/MUBkX4hu/Mwc2jITpwD7lYopvnfSR1yXy1LCwnzrwCYtFg1SGhH0bFvbtWxbiAzywn29dd6ZgfAb2v6i2j+998p9JKv9c7rcvsE5Q/5GE4inX+60eLZ6uI/reBp1/6SsG1ZTHVWZf5z2Oqxi/joEtV8EoVPZQjNEeNGn+Uoe8Kmw+2W28PkPSxTC4Z8LkNZY6r8n/aXmNdZPXtM1rrPZ5TT7leQ2P3+tw3tIj4KO3wWcadGf2s2u6h8R//fKZAp/JhHmrkO0Nb/F85Yq+guMk5Tfyeb6Uwf0nEyN/jUJe1nRrSr+ZhJw1Dr9pl893iiu5LnBpxy95yCOqdrPhI7jcTTie6EIf86uoPIT51TzkELJfeXTNHkk/H2kx+RPP/+0PGupPD1PMQzzunAIPZSPgkhVwx84Tv+1HONwqcJpOiI+4/k5EPtpE9F4A3QN6p+Q8JfOSk0nHuWoc6gKwWqV9LKXgXIXVc8LW39POcwznRynmuXPxoR74K6t/ziL+yrnuOpy/0sJ3zH62rgHf8TYQAZeBNnw3C2fTJ8RXVHM15e9GSfLdfo/9J6j3VcK7qR+G4znWvx+jXeh94rlu/fNCwmswAu6DiufkvCxop1ukZn4iB0heVkzITzkORxH9dAfR/wFggOp/U+/vyl+Zfaz8xf4q1/uHIuA+FKLe/6JpKevf8wnX+8+03tb7mZ5pqPfnkN/HC8i55GcAAAD//zW0L99oJQAA";
+  var serializedRuntimeTypeInfo = "H4sIAAAJbogC/+xZz1PTThRPUgr9wpdfarX8nILo4AHCjB4YTswIIzM6TlU8cGJiWUswbWqSMuqJI38CR4/+CR79M/wzOHrTXfoWt5vdNumEduN0Zx5ht033vc++9z5vdwtas03B8xye/Pgm09ex5KC/gCWPJUB+sLVVsmuVklurvEHeqV1Ggu8/gHf2D0q7h893D7bIi+vh9/j564xeBjO+Ac8VLPPS333q2KgWxJl/lZknw+lD+j+Gmv1VGC9qrW1Kb+1vc59vcOO/oZU0cbuLZQILb9EcHrsN+AvMDeG4hGUUywmWd1jMhu+Zjlu2HLPiuhUHmcduFZlfPMusuieu6Xvl5j9HlheYVr1OJvJN8vcQ93zTrgXIe2+VkW/W8fR1PP2h34RxnbxYFfsT7f8P/qFJ/IvH91KCjwxfjcGX/T2+ET3IkhL4RPougz/0Grcihxe1v2BEt5u0DYndd8B2Yveahz42sIIi+2nrtf28P2wL8pHGfN6pRfUTGV63IH6u9D21nAYS+/cyxGu/8SowuuuMfnxcnUEQXkjyFsX7Ap7fOP/6LsGL16co4JcRZpzksjEskIlfWlUUiWfuYZlk8iP9ZB58XJLmQ+uW61N+7GQfryfLeyPM+hrATySXZbEMM+s4wqzjZQbG4eXiRPN5nIffnwE8FsT+8uuG4msay39X6x8wLBa2f1SRfExx+BQzH29K7J8BDK7tZ5NyyvJyVuPIPYG8LOPvCfD1MjiNyF/m+ugvGqdPsUNdF7We7Tbf83WUHmMd9Ch1lC2uo8b/9TrKHtRRseoou30dNZ6yOuqaD2B/aMTAy2iDVx6wIP61b3kVFLx9/UKA17RivLiXSYYXaX3UYj8TaKrEWeh8QpfHm95DfhyDurDhOcI4m4Yauh9x1m6/0Skv5brAqR1/jUPdUnYbtUCC033F8pHB9GVxWEioPl2EmoWPQx8r7qP08Z2m9Sb+6H7F/aBJ4+9xiniO5q2fwHOZGDhlmHWQ7X/++hezWRfglleE7ygeX2Py3bYEhyXAIoSDovtBnvfOdDX2hZNw7gEqC/1nRcF9oew8K+r9heo8SnB/kiIepf5aNJKJb3I+PCuJb8qladw/qsKnxL92UsintA3FwGmoDZ/Owl77GQoEp9/iezmV+PQs4XgL49BKqIPz1e54lPQf9tFvjBvi0W7jOcetSzbGOmQF3+PrwrAf7yDH+oyOJHXhnCJxTXE5jxnXexI8HgEmUjwG9yeJxDfxn7VBfEvvT4ZjrMNwhPuTVw1beH+wqNj9yaWW7P0JsVvF+5Oc1rm+Y7/3JwAA///Y0/jDWCcAAA==";
 
   // Deserialize RuntimeTypeInfo
   var bytes = BASE64.decode(serializedRuntimeTypeInfo);
diff --git a/mojo/dart/packages/mojo/lib/core.dart b/mojo/dart/packages/mojo/lib/core.dart
index d504d0f..789fe6c 100644
--- a/mojo/dart/packages/mojo/lib/core.dart
+++ b/mojo/dart/packages/mojo/lib/core.dart
@@ -13,7 +13,8 @@
 part 'src/buffer.dart';
 part 'src/data_pipe.dart';
 part 'src/drain_data.dart';
-part 'src/event_stream.dart';
+part 'src/event_subscription.dart';
+part 'src/event_handler.dart';
 part 'src/fill_data.dart';
 part 'src/handle.dart';
 part 'src/message_pipe.dart';
diff --git a/mojo/dart/packages/mojo/lib/mojo/application.mojom.dart b/mojo/dart/packages/mojo/lib/mojo/application.mojom.dart
index 5822b96..26c6537 100644
--- a/mojo/dart/packages/mojo/lib/mojo/application.mojom.dart
+++ b/mojo/dart/packages/mojo/lib/mojo/application.mojom.dart
@@ -316,24 +316,22 @@
 }
 
 
-class _ApplicationProxyImpl extends bindings.Proxy {
-  _ApplicationProxyImpl.fromEndpoint(
+class _ApplicationProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _ApplicationProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _ApplicationProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _ApplicationProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _ApplicationProxyImpl.unbound() : super.unbound();
-
-  static _ApplicationProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _ApplicationProxyImpl"));
-    return new _ApplicationProxyImpl.fromEndpoint(endpoint);
-  }
+  _ApplicationProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _ApplicationServiceDescription();
+      new _ApplicationServiceDescription();
 
+  String get serviceName => Application.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -343,73 +341,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_ApplicationProxyImpl($superString)";
+    return "_ApplicationProxyControl($superString)";
   }
 }
 
 
-class _ApplicationProxyCalls implements Application {
-  _ApplicationProxyImpl _proxyImpl;
-
-  _ApplicationProxyCalls(this._proxyImpl);
-    void initialize(Object shell, List<String> args, String url) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _ApplicationInitializeParams();
-      params.shell = shell;
-      params.args = args;
-      params.url = url;
-      _proxyImpl.sendMessage(params, _applicationMethodInitializeName);
-    }
-    void acceptConnection(String requestorUrl, Object services, Object exposedServices, String resolvedUrl) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _ApplicationAcceptConnectionParams();
-      params.requestorUrl = requestorUrl;
-      params.services = services;
-      params.exposedServices = exposedServices;
-      params.resolvedUrl = resolvedUrl;
-      _proxyImpl.sendMessage(params, _applicationMethodAcceptConnectionName);
-    }
-    void requestQuit() {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _ApplicationRequestQuitParams();
-      _proxyImpl.sendMessage(params, _applicationMethodRequestQuitName);
-    }
-}
-
-
-class ApplicationProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  Application ptr;
-
-  ApplicationProxy(_ApplicationProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _ApplicationProxyCalls(proxyImpl);
-
+class ApplicationProxy extends bindings.Proxy
+                              implements Application {
   ApplicationProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _ApplicationProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _ApplicationProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _ApplicationProxyControl.fromEndpoint(endpoint));
 
-  ApplicationProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _ApplicationProxyImpl.fromHandle(handle) {
-    ptr = new _ApplicationProxyCalls(impl);
-  }
+  ApplicationProxy.fromHandle(core.MojoHandle handle)
+      : super(new _ApplicationProxyControl.fromHandle(handle));
 
-  ApplicationProxy.unbound() :
-      impl = new _ApplicationProxyImpl.unbound() {
-    ptr = new _ApplicationProxyCalls(impl);
+  ApplicationProxy.unbound()
+      : super(new _ApplicationProxyControl.unbound());
+
+  static ApplicationProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ApplicationProxy"));
+    return new ApplicationProxy.fromEndpoint(endpoint);
   }
 
   factory ApplicationProxy.connectToService(
@@ -419,30 +374,40 @@
     return p;
   }
 
-  static ApplicationProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For ApplicationProxy"));
-    return new ApplicationProxy.fromEndpoint(endpoint);
+
+  void initialize(Object shell, List<String> args, String url) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _ApplicationInitializeParams();
+    params.shell = shell;
+    params.args = args;
+    params.url = url;
+    ctrl.sendMessage(params,
+        _applicationMethodInitializeName);
   }
-
-  String get serviceName => Application.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
+  void acceptConnection(String requestorUrl, Object services, Object exposedServices, String resolvedUrl) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _ApplicationAcceptConnectionParams();
+    params.requestorUrl = requestorUrl;
+    params.services = services;
+    params.exposedServices = exposedServices;
+    params.resolvedUrl = resolvedUrl;
+    ctrl.sendMessage(params,
+        _applicationMethodAcceptConnectionName);
   }
-
-  String toString() {
-    return "ApplicationProxy($impl)";
+  void requestQuit() {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _ApplicationRequestQuitParams();
+    ctrl.sendMessage(params,
+        _applicationMethodRequestQuitName);
   }
 }
 
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 696e832..4550496 100644
--- a/mojo/dart/packages/mojo/lib/mojo/application_connector.mojom.dart
+++ b/mojo/dart/packages/mojo/lib/mojo/application_connector.mojom.dart
@@ -199,24 +199,22 @@
 }
 
 
-class _ApplicationConnectorProxyImpl extends bindings.Proxy {
-  _ApplicationConnectorProxyImpl.fromEndpoint(
+class _ApplicationConnectorProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _ApplicationConnectorProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _ApplicationConnectorProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _ApplicationConnectorProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _ApplicationConnectorProxyImpl.unbound() : super.unbound();
-
-  static _ApplicationConnectorProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _ApplicationConnectorProxyImpl"));
-    return new _ApplicationConnectorProxyImpl.fromEndpoint(endpoint);
-  }
+  _ApplicationConnectorProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _ApplicationConnectorServiceDescription();
+      new _ApplicationConnectorServiceDescription();
 
+  String get serviceName => ApplicationConnector.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -226,62 +224,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_ApplicationConnectorProxyImpl($superString)";
+    return "_ApplicationConnectorProxyControl($superString)";
   }
 }
 
 
-class _ApplicationConnectorProxyCalls implements ApplicationConnector {
-  _ApplicationConnectorProxyImpl _proxyImpl;
-
-  _ApplicationConnectorProxyCalls(this._proxyImpl);
-    void connectToApplication(String applicationUrl, Object services, Object exposedServices) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _ApplicationConnectorConnectToApplicationParams();
-      params.applicationUrl = applicationUrl;
-      params.services = services;
-      params.exposedServices = exposedServices;
-      _proxyImpl.sendMessage(params, _applicationConnectorMethodConnectToApplicationName);
-    }
-    void duplicate(Object applicationConnectorRequest) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _ApplicationConnectorDuplicateParams();
-      params.applicationConnectorRequest = applicationConnectorRequest;
-      _proxyImpl.sendMessage(params, _applicationConnectorMethodDuplicateName);
-    }
-}
-
-
-class ApplicationConnectorProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  ApplicationConnector ptr;
-
-  ApplicationConnectorProxy(_ApplicationConnectorProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _ApplicationConnectorProxyCalls(proxyImpl);
-
+class ApplicationConnectorProxy extends bindings.Proxy
+                              implements ApplicationConnector {
   ApplicationConnectorProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _ApplicationConnectorProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _ApplicationConnectorProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _ApplicationConnectorProxyControl.fromEndpoint(endpoint));
 
-  ApplicationConnectorProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _ApplicationConnectorProxyImpl.fromHandle(handle) {
-    ptr = new _ApplicationConnectorProxyCalls(impl);
-  }
+  ApplicationConnectorProxy.fromHandle(core.MojoHandle handle)
+      : super(new _ApplicationConnectorProxyControl.fromHandle(handle));
 
-  ApplicationConnectorProxy.unbound() :
-      impl = new _ApplicationConnectorProxyImpl.unbound() {
-    ptr = new _ApplicationConnectorProxyCalls(impl);
+  ApplicationConnectorProxy.unbound()
+      : super(new _ApplicationConnectorProxyControl.unbound());
+
+  static ApplicationConnectorProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ApplicationConnectorProxy"));
+    return new ApplicationConnectorProxy.fromEndpoint(endpoint);
   }
 
   factory ApplicationConnectorProxy.connectToService(
@@ -291,30 +257,28 @@
     return p;
   }
 
-  static ApplicationConnectorProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For ApplicationConnectorProxy"));
-    return new ApplicationConnectorProxy.fromEndpoint(endpoint);
+
+  void connectToApplication(String applicationUrl, Object services, Object exposedServices) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _ApplicationConnectorConnectToApplicationParams();
+    params.applicationUrl = applicationUrl;
+    params.services = services;
+    params.exposedServices = exposedServices;
+    ctrl.sendMessage(params,
+        _applicationConnectorMethodConnectToApplicationName);
   }
-
-  String get serviceName => ApplicationConnector.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "ApplicationConnectorProxy($impl)";
+  void duplicate(Object applicationConnectorRequest) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _ApplicationConnectorDuplicateParams();
+    params.applicationConnectorRequest = applicationConnectorRequest;
+    ctrl.sendMessage(params,
+        _applicationConnectorMethodDuplicateName);
   }
 }
 
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 860cac1..7078340 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
@@ -575,24 +575,22 @@
 }
 
 
-class _ServiceDescriberProxyImpl extends bindings.Proxy {
-  _ServiceDescriberProxyImpl.fromEndpoint(
+class _ServiceDescriberProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _ServiceDescriberProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _ServiceDescriberProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _ServiceDescriberProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _ServiceDescriberProxyImpl.unbound() : super.unbound();
-
-  static _ServiceDescriberProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _ServiceDescriberProxyImpl"));
-    return new _ServiceDescriberProxyImpl.fromEndpoint(endpoint);
-  }
+  _ServiceDescriberProxyControl.unbound() : super.unbound();
 
   ServiceDescription get serviceDescription =>
-    new _ServiceDescriberServiceDescription();
+      new _ServiceDescriberServiceDescription();
 
+  String get serviceName => ServiceDescriber.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -602,52 +600,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_ServiceDescriberProxyImpl($superString)";
+    return "_ServiceDescriberProxyControl($superString)";
   }
 }
 
 
-class _ServiceDescriberProxyCalls implements ServiceDescriber {
-  _ServiceDescriberProxyImpl _proxyImpl;
-
-  _ServiceDescriberProxyCalls(this._proxyImpl);
-    void describeService(String interfaceName, Object descriptionRequest) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _ServiceDescriberDescribeServiceParams();
-      params.interfaceName = interfaceName;
-      params.descriptionRequest = descriptionRequest;
-      _proxyImpl.sendMessage(params, _serviceDescriberMethodDescribeServiceName);
-    }
-}
-
-
-class ServiceDescriberProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  ServiceDescriber ptr;
-
-  ServiceDescriberProxy(_ServiceDescriberProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _ServiceDescriberProxyCalls(proxyImpl);
-
+class ServiceDescriberProxy extends bindings.Proxy
+                              implements ServiceDescriber {
   ServiceDescriberProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _ServiceDescriberProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _ServiceDescriberProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _ServiceDescriberProxyControl.fromEndpoint(endpoint));
 
-  ServiceDescriberProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _ServiceDescriberProxyImpl.fromHandle(handle) {
-    ptr = new _ServiceDescriberProxyCalls(impl);
-  }
+  ServiceDescriberProxy.fromHandle(core.MojoHandle handle)
+      : super(new _ServiceDescriberProxyControl.fromHandle(handle));
 
-  ServiceDescriberProxy.unbound() :
-      impl = new _ServiceDescriberProxyImpl.unbound() {
-    ptr = new _ServiceDescriberProxyCalls(impl);
+  ServiceDescriberProxy.unbound()
+      : super(new _ServiceDescriberProxyControl.unbound());
+
+  static ServiceDescriberProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ServiceDescriberProxy"));
+    return new ServiceDescriberProxy.fromEndpoint(endpoint);
   }
 
   factory ServiceDescriberProxy.connectToService(
@@ -657,30 +633,17 @@
     return p;
   }
 
-  static ServiceDescriberProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For ServiceDescriberProxy"));
-    return new ServiceDescriberProxy.fromEndpoint(endpoint);
-  }
 
-  String get serviceName => ServiceDescriber.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "ServiceDescriberProxy($impl)";
+  void describeService(String interfaceName, Object descriptionRequest) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _ServiceDescriberDescribeServiceParams();
+    params.interfaceName = interfaceName;
+    params.descriptionRequest = descriptionRequest;
+    ctrl.sendMessage(params,
+        _serviceDescriberMethodDescribeServiceName);
   }
 }
 
@@ -790,24 +753,22 @@
 }
 
 
-class _ServiceDescriptionProxyImpl extends bindings.Proxy {
-  _ServiceDescriptionProxyImpl.fromEndpoint(
+class _ServiceDescriptionProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _ServiceDescriptionProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _ServiceDescriptionProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _ServiceDescriptionProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _ServiceDescriptionProxyImpl.unbound() : super.unbound();
-
-  static _ServiceDescriptionProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _ServiceDescriptionProxyImpl"));
-    return new _ServiceDescriptionProxyImpl.fromEndpoint(endpoint);
-  }
+  _ServiceDescriptionProxyControl.unbound() : super.unbound();
 
   ServiceDescription get serviceDescription =>
-    new _ServiceDescriptionServiceDescription();
+      new _ServiceDescriptionServiceDescription();
 
+  String get serviceName => ServiceDescription.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _serviceDescriptionMethodGetTopLevelInterfaceName:
@@ -877,67 +838,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_ServiceDescriptionProxyImpl($superString)";
+    return "_ServiceDescriptionProxyControl($superString)";
   }
 }
 
 
-class _ServiceDescriptionProxyCalls implements ServiceDescription {
-  _ServiceDescriptionProxyImpl _proxyImpl;
-
-  _ServiceDescriptionProxyCalls(this._proxyImpl);
-    dynamic getTopLevelInterface([Function responseFactory = null]) {
-      var params = new _ServiceDescriptionGetTopLevelInterfaceParams();
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _serviceDescriptionMethodGetTopLevelInterfaceName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    dynamic getTypeDefinition(String typeKey,[Function responseFactory = null]) {
-      var params = new _ServiceDescriptionGetTypeDefinitionParams();
-      params.typeKey = typeKey;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _serviceDescriptionMethodGetTypeDefinitionName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    dynamic getAllTypeDefinitions([Function responseFactory = null]) {
-      var params = new _ServiceDescriptionGetAllTypeDefinitionsParams();
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _serviceDescriptionMethodGetAllTypeDefinitionsName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-}
-
-
-class ServiceDescriptionProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  ServiceDescription ptr;
-
-  ServiceDescriptionProxy(_ServiceDescriptionProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _ServiceDescriptionProxyCalls(proxyImpl);
-
+class ServiceDescriptionProxy extends bindings.Proxy
+                              implements ServiceDescription {
   ServiceDescriptionProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _ServiceDescriptionProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _ServiceDescriptionProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _ServiceDescriptionProxyControl.fromEndpoint(endpoint));
 
-  ServiceDescriptionProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _ServiceDescriptionProxyImpl.fromHandle(handle) {
-    ptr = new _ServiceDescriptionProxyCalls(impl);
-  }
+  ServiceDescriptionProxy.fromHandle(core.MojoHandle handle)
+      : super(new _ServiceDescriptionProxyControl.fromHandle(handle));
 
-  ServiceDescriptionProxy.unbound() :
-      impl = new _ServiceDescriptionProxyImpl.unbound() {
-    ptr = new _ServiceDescriptionProxyCalls(impl);
+  ServiceDescriptionProxy.unbound()
+      : super(new _ServiceDescriptionProxyControl.unbound());
+
+  static ServiceDescriptionProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ServiceDescriptionProxy"));
+    return new ServiceDescriptionProxy.fromEndpoint(endpoint);
   }
 
   factory ServiceDescriptionProxy.connectToService(
@@ -947,30 +871,31 @@
     return p;
   }
 
-  static ServiceDescriptionProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For ServiceDescriptionProxy"));
-    return new ServiceDescriptionProxy.fromEndpoint(endpoint);
+
+  dynamic getTopLevelInterface([Function responseFactory = null]) {
+    var params = new _ServiceDescriptionGetTopLevelInterfaceParams();
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _serviceDescriptionMethodGetTopLevelInterfaceName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
-
-  String get serviceName => ServiceDescription.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
+  dynamic getTypeDefinition(String typeKey,[Function responseFactory = null]) {
+    var params = new _ServiceDescriptionGetTypeDefinitionParams();
+    params.typeKey = typeKey;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _serviceDescriptionMethodGetTypeDefinitionName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
-
-  String toString() {
-    return "ServiceDescriptionProxy($impl)";
+  dynamic getAllTypeDefinitions([Function responseFactory = null]) {
+    var params = new _ServiceDescriptionGetAllTypeDefinitionsParams();
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _serviceDescriptionMethodGetAllTypeDefinitionsName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
 }
 
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 887d180..979c6fb 100644
--- a/mojo/dart/packages/mojo/lib/mojo/service_provider.mojom.dart
+++ b/mojo/dart/packages/mojo/lib/mojo/service_provider.mojom.dart
@@ -108,28 +108,26 @@
 
 abstract class ServiceProvider {
   static const String serviceName = null;
-  void connectToService(String interfaceName, core.MojoMessagePipeEndpoint pipe);
+  void connectToService_(String interfaceName, core.MojoMessagePipeEndpoint pipe);
 }
 
 
-class _ServiceProviderProxyImpl extends bindings.Proxy {
-  _ServiceProviderProxyImpl.fromEndpoint(
+class _ServiceProviderProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _ServiceProviderProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _ServiceProviderProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _ServiceProviderProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _ServiceProviderProxyImpl.unbound() : super.unbound();
-
-  static _ServiceProviderProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _ServiceProviderProxyImpl"));
-    return new _ServiceProviderProxyImpl.fromEndpoint(endpoint);
-  }
+  _ServiceProviderProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _ServiceProviderServiceDescription();
+      new _ServiceProviderServiceDescription();
 
+  String get serviceName => ServiceProvider.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -139,52 +137,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_ServiceProviderProxyImpl($superString)";
+    return "_ServiceProviderProxyControl($superString)";
   }
 }
 
 
-class _ServiceProviderProxyCalls implements ServiceProvider {
-  _ServiceProviderProxyImpl _proxyImpl;
-
-  _ServiceProviderProxyCalls(this._proxyImpl);
-    void connectToService(String interfaceName, core.MojoMessagePipeEndpoint pipe) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _ServiceProviderConnectToServiceParams();
-      params.interfaceName = interfaceName;
-      params.pipe = pipe;
-      _proxyImpl.sendMessage(params, _serviceProviderMethodConnectToServiceName);
-    }
-}
-
-
-class ServiceProviderProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  ServiceProvider ptr;
-
-  ServiceProviderProxy(_ServiceProviderProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _ServiceProviderProxyCalls(proxyImpl);
-
+class ServiceProviderProxy extends bindings.Proxy
+                              implements ServiceProvider {
   ServiceProviderProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _ServiceProviderProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _ServiceProviderProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _ServiceProviderProxyControl.fromEndpoint(endpoint));
 
-  ServiceProviderProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _ServiceProviderProxyImpl.fromHandle(handle) {
-    ptr = new _ServiceProviderProxyCalls(impl);
-  }
+  ServiceProviderProxy.fromHandle(core.MojoHandle handle)
+      : super(new _ServiceProviderProxyControl.fromHandle(handle));
 
-  ServiceProviderProxy.unbound() :
-      impl = new _ServiceProviderProxyImpl.unbound() {
-    ptr = new _ServiceProviderProxyCalls(impl);
+  ServiceProviderProxy.unbound()
+      : super(new _ServiceProviderProxyControl.unbound());
+
+  static ServiceProviderProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ServiceProviderProxy"));
+    return new ServiceProviderProxy.fromEndpoint(endpoint);
   }
 
   factory ServiceProviderProxy.connectToService(
@@ -194,30 +170,17 @@
     return p;
   }
 
-  static ServiceProviderProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For ServiceProviderProxy"));
-    return new ServiceProviderProxy.fromEndpoint(endpoint);
-  }
 
-  String get serviceName => ServiceProvider.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "ServiceProviderProxy($impl)";
+  void connectToService_(String interfaceName, core.MojoMessagePipeEndpoint pipe) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _ServiceProviderConnectToServiceParams();
+    params.interfaceName = interfaceName;
+    params.pipe = pipe;
+    ctrl.sendMessage(params,
+        _serviceProviderMethodConnectToServiceName);
   }
 }
 
@@ -260,7 +223,7 @@
       case _serviceProviderMethodConnectToServiceName:
         var params = _ServiceProviderConnectToServiceParams.deserialize(
             message.payload);
-        _impl.connectToService(params.interfaceName, params.pipe);
+        _impl.connectToService_(params.interfaceName, params.pipe);
         break;
       default:
         throw new bindings.MojoCodecError("Unexpected message name");
diff --git a/mojo/dart/packages/mojo/lib/mojo/shell.mojom.dart b/mojo/dart/packages/mojo/lib/mojo/shell.mojom.dart
index f8495d0..b8d45d5 100644
--- a/mojo/dart/packages/mojo/lib/mojo/shell.mojom.dart
+++ b/mojo/dart/packages/mojo/lib/mojo/shell.mojom.dart
@@ -200,24 +200,22 @@
 }
 
 
-class _ShellProxyImpl extends bindings.Proxy {
-  _ShellProxyImpl.fromEndpoint(
+class _ShellProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _ShellProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _ShellProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _ShellProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _ShellProxyImpl.unbound() : super.unbound();
-
-  static _ShellProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _ShellProxyImpl"));
-    return new _ShellProxyImpl.fromEndpoint(endpoint);
-  }
+  _ShellProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _ShellServiceDescription();
+      new _ShellServiceDescription();
 
+  String get serviceName => Shell.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -227,62 +225,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_ShellProxyImpl($superString)";
+    return "_ShellProxyControl($superString)";
   }
 }
 
 
-class _ShellProxyCalls implements Shell {
-  _ShellProxyImpl _proxyImpl;
-
-  _ShellProxyCalls(this._proxyImpl);
-    void connectToApplication(String applicationUrl, Object services, Object exposedServices) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _ShellConnectToApplicationParams();
-      params.applicationUrl = applicationUrl;
-      params.services = services;
-      params.exposedServices = exposedServices;
-      _proxyImpl.sendMessage(params, _shellMethodConnectToApplicationName);
-    }
-    void createApplicationConnector(Object applicationConnectorRequest) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _ShellCreateApplicationConnectorParams();
-      params.applicationConnectorRequest = applicationConnectorRequest;
-      _proxyImpl.sendMessage(params, _shellMethodCreateApplicationConnectorName);
-    }
-}
-
-
-class ShellProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  Shell ptr;
-
-  ShellProxy(_ShellProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _ShellProxyCalls(proxyImpl);
-
+class ShellProxy extends bindings.Proxy
+                              implements Shell {
   ShellProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _ShellProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _ShellProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _ShellProxyControl.fromEndpoint(endpoint));
 
-  ShellProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _ShellProxyImpl.fromHandle(handle) {
-    ptr = new _ShellProxyCalls(impl);
-  }
+  ShellProxy.fromHandle(core.MojoHandle handle)
+      : super(new _ShellProxyControl.fromHandle(handle));
 
-  ShellProxy.unbound() :
-      impl = new _ShellProxyImpl.unbound() {
-    ptr = new _ShellProxyCalls(impl);
+  ShellProxy.unbound()
+      : super(new _ShellProxyControl.unbound());
+
+  static ShellProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ShellProxy"));
+    return new ShellProxy.fromEndpoint(endpoint);
   }
 
   factory ShellProxy.connectToService(
@@ -292,30 +258,28 @@
     return p;
   }
 
-  static ShellProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For ShellProxy"));
-    return new ShellProxy.fromEndpoint(endpoint);
+
+  void connectToApplication(String applicationUrl, Object services, Object exposedServices) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _ShellConnectToApplicationParams();
+    params.applicationUrl = applicationUrl;
+    params.services = services;
+    params.exposedServices = exposedServices;
+    ctrl.sendMessage(params,
+        _shellMethodConnectToApplicationName);
   }
-
-  String get serviceName => Shell.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "ShellProxy($impl)";
+  void createApplicationConnector(Object applicationConnectorRequest) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _ShellCreateApplicationConnectorParams();
+    params.applicationConnectorRequest = applicationConnectorRequest;
+    ctrl.sendMessage(params,
+        _shellMethodCreateApplicationConnectorName);
   }
 }
 
diff --git a/mojo/dart/packages/mojo/lib/src/application.dart b/mojo/dart/packages/mojo/lib/src/application.dart
index 488127f..ba19009 100644
--- a/mojo/dart/packages/mojo/lib/src/application.dart
+++ b/mojo/dart/packages/mojo/lib/src/application.dart
@@ -35,7 +35,7 @@
   }
 
   void initialize(
-      bindings.ProxyBase shellProxy, List<String> args, String url) {
+      bindings.Proxy shellProxy, List<String> args, String url) {
     assert(shell == null);
     shell = shellProxy;
     _application.initialize(args, url);
@@ -43,7 +43,7 @@
 
   @override
   void acceptConnection(String requestorUrl, ServiceProviderStub services,
-          bindings.ProxyBase exposedServices, String resolvedUrl) =>
+          bindings.Proxy exposedServices, String resolvedUrl) =>
       _application._acceptConnection(
           requestorUrl, services, exposedServices, resolvedUrl);
 
@@ -97,13 +97,13 @@
   // Returns a connection to the app at |url|.
   ApplicationConnection connectToApplication(String url) {
     var proxy = new ServiceProviderProxy.unbound();
-    _applicationImpl.shell.ptr.connectToApplication(url, proxy, null);
+    _applicationImpl.shell.connectToApplication(url, proxy, null);
     var connection = new ApplicationConnection(null, proxy);
     _applicationConnections.add(connection);
     return connection;
   }
 
-  void connectToService(String url, bindings.ProxyBase proxy,
+  void connectToService(String url, bindings.Proxy proxy,
       [String serviceName]) {
     connectToApplication(url).requestService(proxy, serviceName);
   }
diff --git a/mojo/dart/packages/mojo/lib/src/application_connection.dart b/mojo/dart/packages/mojo/lib/src/application_connection.dart
index cb89b91..da1a28a 100644
--- a/mojo/dart/packages/mojo/lib/src/application_connection.dart
+++ b/mojo/dart/packages/mojo/lib/src/application_connection.dart
@@ -25,7 +25,7 @@
 
   Future close({bool immediate: false}) => _stub.close(immediate: immediate);
 
-  void connectToService(
+  void connectToService_(
       String interfaceName, core.MojoMessagePipeEndpoint pipe) {
     if (connection._nameToServiceFactory.containsKey(interfaceName)) {
       connection._nameToServiceFactory[interfaceName](pipe);
@@ -90,24 +90,24 @@
     _fallbackServiceFactory = f;
   }
 
-  bindings.ProxyBase requestService(bindings.ProxyBase proxy,
+  bindings.Proxy requestService(bindings.Proxy proxy,
       [String serviceName]) {
-    if (proxy.impl.isBound ||
+    if (proxy.ctrl.isBound ||
         (remoteServiceProvider == null) ||
-        !remoteServiceProvider.impl.isBound) {
+        !remoteServiceProvider.ctrl.isBound) {
       throw new core.MojoApiError(
           "The proxy is bound, or there is no remove service provider proxy");
     }
 
-    var name = serviceName ?? proxy.serviceName;
+    var name = serviceName ?? proxy.ctrl.serviceName;
     if ((name == null) || name.isEmpty) {
       throw new core.MojoApiError(
           "If an interface has no ServiceName, then one must be provided.");
     }
 
     var pipe = new core.MojoMessagePipe();
-    proxy.impl.bind(pipe.endpoints[0]);
-    remoteServiceProvider.ptr.connectToService(name, pipe.endpoints[1]);
+    proxy.ctrl.bind(pipe.endpoints[0]);
+    remoteServiceProvider.connectToService_(name, pipe.endpoints[1]);
     return proxy;
   }
 
diff --git a/mojo/dart/packages/mojo/lib/src/codec.dart b/mojo/dart/packages/mojo/lib/src/codec.dart
index 092a960..5fd7ac6 100644
--- a/mojo/dart/packages/mojo/lib/src/codec.dart
+++ b/mojo/dart/packages/mojo/lib/src/codec.dart
@@ -210,7 +210,7 @@
       encodeHandle(value != null ? value.handle : null, offset, nullable);
 
   void encodeInterface(
-      core.MojoEventHandler interface, int offset, bool nullable) {
+      Object interface, int offset, bool nullable) {
     if (interface == null) {
       encodeInvalideHandle(offset, nullable);
       // Set the version field to 0.
@@ -228,18 +228,18 @@
       // Set the version to the version in the stub.
       encodeUint32(interface.version, offset + kSerializedHandleSize);
     } else if (interface is Proxy) {
-      if (!interface.isBound) {
+      if (!interface.ctrl.isBound) {
         throw new MojoCodecError(
             'Cannot encode an unbound proxy for an interface');
       }
-      if (!interface.isOpen) {
+      if (!interface.ctrl.isOpen) {
         // Make sure that we are listening so that state for the proxy is
         // cleaned up when the message is sent and the handle is closed.
-        interface.beginHandlingEvents();
+        interface.ctrl.beginHandlingEvents();
       }
-      encodeMessagePipeHandle(interface.endpoint, offset, nullable);
+      encodeMessagePipeHandle(interface.ctrl.endpoint, offset, nullable);
       // Set the version to the current version of the proxy.
-      encodeUint32(interface.version, offset + kSerializedHandleSize);
+      encodeUint32(interface.ctrl.version, offset + kSerializedHandleSize);
     } else {
       throw new MojoCodecError('Cannot encode an unknown MojoEventHandler');
     }
@@ -250,14 +250,14 @@
       encodeInvalideHandle(offset, nullable);
       return;
     }
-    if (request is ProxyBase) {
-      if (request.impl.isBound) {
+    if (request is Proxy) {
+      if (request.ctrl.isBound) {
         throw new MojoCodecError(
             'Cannot encode a bound proxy for an interface request');
       }
       var pipe = new core.MojoMessagePipe();
-      request.impl.bind(pipe.endpoints[0]);
-      request.impl.beginHandlingEvents();
+      request.ctrl.bind(pipe.endpoints[0]);
+      request.ctrl.beginHandlingEvents();
       encodeMessagePipeHandle(pipe.endpoints[1], offset, nullable);
     } else if (request is Stub) {
       if (!request.isBound) {
@@ -746,15 +746,15 @@
   core.MojoSharedBuffer decodeSharedBufferHandle(int offset, bool nullable) =>
       new core.MojoSharedBuffer(decodeHandle(offset, nullable));
 
-  ProxyBase decodeServiceInterface(
+  Proxy decodeServiceInterface(
       int offset, bool nullable, Function clientFactory) {
     var endpoint = decodeMessagePipeHandle(offset, nullable);
     var version = decodeUint32(offset + kSerializedHandleSize);
     if (!endpoint.handle.isValid) {
       return null;
     }
-    ProxyBase client = clientFactory(endpoint);
-    client.impl._version = version;
+    Proxy client = clientFactory(endpoint);
+    client.ctrl._version = version;
     return client;
   }
 
diff --git a/mojo/dart/packages/mojo/lib/src/event_stream.dart b/mojo/dart/packages/mojo/lib/src/event_handler.dart
similarity index 61%
rename from mojo/dart/packages/mojo/lib/src/event_stream.dart
rename to mojo/dart/packages/mojo/lib/src/event_handler.dart
index ea3e5f5..cbdefa3 100644
--- a/mojo/dart/packages/mojo/lib/src/event_stream.dart
+++ b/mojo/dart/packages/mojo/lib/src/event_handler.dart
@@ -1,148 +1,24 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
+// Copyright 2016 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
 part of core;
 
-class MojoEventSubscription {
-  // The underlying Mojo handle.
-  MojoHandle _handle;
-
-  // The send port that we give to the handle watcher to notify us of handle
-  // events.
-  SendPort _sendPort;
-
-  // The receive port on which we listen and receive events from the handle
-  // watcher.
-  RawReceivePort _receivePort;
-
-  // The signals on this handle that we're interested in.
-  int _signals;
-
-  // Whether subscribe() has been called.
-  bool _isSubscribed;
-
-  MojoEventSubscription(MojoHandle handle,
-      [int signals = MojoHandleSignals.kPeerClosedReadable])
-      : _handle = handle,
-        _signals = signals,
-        _isSubscribed = false {
-    if (!MojoHandle.registerFinalizer(this)) {
-      throw new MojoInternalError("Failed to register the MojoHandle.");
-    }
-  }
-
-  Future close({bool immediate: false}) => _close(immediate: immediate);
-
-  void subscribe(void handler(int event)) {
-    if (_isSubscribed) {
-      throw new MojoApiError("Already subscribed: $this.");
-    }
-    _receivePort = new RawReceivePort(handler);
-    _sendPort = _receivePort.sendPort;
-
-    if (_signals != MojoHandleSignals.kNone) {
-      int res = MojoHandleWatcher.add(_handle.h, _sendPort, _signals);
-      if (res != MojoResult.kOk) {
-        throw new MojoInternalError("MojoHandleWatcher add failed: $res");
-      }
-    }
-    _isSubscribed = true;
-  }
-
-  bool enableSignals([int signals]) {
-    if (signals != null) {
-      _signals = signals;
-    }
-    if (_isSubscribed) {
-      return MojoHandleWatcher.add(_handle.h, _sendPort, _signals) ==
-          MojoResult.kOk;
-    }
-    return false;
-  }
-
-  bool enableReadEvents() =>
-      enableSignals(MojoHandleSignals.kPeerClosedReadable);
-  bool enableWriteEvents() => enableSignals(MojoHandleSignals.kWritable);
-  bool enableAllEvents() => enableSignals(MojoHandleSignals.kReadWrite);
-
-  /// End the subscription by removing the handle from the handle watcher and
-  /// closing the Dart port, but do not close the underlying handle. The handle
-  /// can then be reused, or closed at a later time.
-  void unsubscribe({bool immediate: false}) {
-    if ((_handle == null) || !_isSubscribed || (_receivePort == null)) {
-      throw new MojoApiError("Cannont unsubscribe from a MojoEventSubscription "
-                             "that has not been subscribed to");
-    }
-    MojoHandleWatcher.remove(_handle.h);
-    _receivePort.close();
-    _receivePort = null;
-    _sendPort = null;
-    _isSubscribed = false;
-  }
-
-  Future _close({bool immediate: false, bool local: false}) {
-    if (_handle != null) {
-      if (_isSubscribed && !local) {
-        return _handleWatcherClose(immediate: immediate).then((result) {
-          // If the handle watcher is gone, then close the handle ourselves.
-          if (result != MojoResult.kOk) {
-            _localClose();
-          }
-        });
-      } else {
-        _localClose();
-      }
-    }
-    return new Future.value(null);
-  }
-
-  Future _handleWatcherClose({bool immediate: false}) {
-    assert(_handle != null);
-    MojoHandleNatives.removeOpenHandle(_handle.h);
-    return MojoHandleWatcher.close(_handle.h, wait: !immediate).then((r) {
-      if (_receivePort != null) {
-        _receivePort.close();
-        _receivePort = null;
-      }
-      return r;
-    });
-  }
-
-  void _localClose() {
-    if (_handle != null) {
-      _handle.close();
-      _handle = null;
-    }
-    if (_receivePort != null) {
-      _receivePort.close();
-      _receivePort = null;
-    }
-  }
-
-  bool get readyRead => _handle.readyRead;
-  bool get readyWrite => _handle.readyWrite;
-  int get signals => _signals;
-
-  String toString() => "$_handle";
-}
-
-/// Object returned to pipe's error handlers containing both the thrown error
-/// and the associated stack trace.
-class MojoHandlerError {
+/// The object passed to the handler's error handling function containing both
+/// the thrown error and the associated stack trace.
+class MojoEventHandlerError {
   final Object error;
   final StackTrace stacktrace;
 
-  MojoHandlerError(this.error, this.stacktrace);
+  MojoEventHandlerError(this.error, this.stacktrace);
 
+  @override
   String toString() => error.toString();
 }
 
-typedef void ErrorHandler(MojoHandlerError e);
+typedef void ErrorHandler(MojoEventHandlerError e);
 
 class MojoEventHandler {
-  ErrorHandler onError;
-
   MojoMessagePipeEndpoint _endpoint;
   MojoEventSubscription _eventSubscription;
   bool _isOpen = false;
@@ -168,6 +44,29 @@
 
   MojoEventHandler.unbound();
 
+  /// The event handler calls the [handleRead] method when the underlying Mojo
+  /// message pipe endpoint has a message available to be read. Implementers
+  /// should read, decode, and handle the message. If [handleRead] throws
+  /// an exception derived from [Error], the exception will be thrown into the
+  /// root zone, and the application will end. Otherwise, the exception object
+  /// will be passed to [onError] if it has been set, and the exception will
+  /// not be propagated to the root zone.
+  void handleRead() {}
+
+  /// Like [handleRead] but indicating that the underlying message pipe endpoint
+  /// is ready for writing.
+  void handleWrite() {}
+
+  /// Called when [handleRead] or [handleWrite] throw an exception generated by
+  /// Mojo library code. Other exceptions will be re-thrown.
+  ErrorHandler onError;
+
+  MojoMessagePipeEndpoint get endpoint => _endpoint;
+  bool get isOpen => _isOpen;
+  bool get isInHandler => _isInHandler;
+  bool get isBound => _endpoint != null;
+  bool get isPeerClosed => _isPeerClosed;
+
   void bind(MojoMessagePipeEndpoint endpoint) {
     if (isBound) {
       throw new MojoApiError("MojoEventHandler is already bound.");
@@ -252,6 +151,10 @@
     return result != null ? result : new Future.value(null);
   }
 
+  @override
+  String toString() => "MojoEventHandler("
+      "isOpen: $_isOpen, isBound: $isBound, endpoint: $_endpoint)";
+
   void _tryHandleEvent(int event) {
     // This callback is running in the handler for a RawReceivePort. All
     // exceptions rethrown or not caught here will be unhandled exceptions in
@@ -271,7 +174,7 @@
     } catch (e, s) {
       close(immediate: true).then((_) {
         if (onError != null) {
-          onError(new MojoHandlerError(e, s));
+          onError(new MojoEventHandlerError(e, s));
         }
       });
     }
@@ -302,26 +205,4 @@
       });
     }
   }
-
-  /// The event handler calls the [handleRead] method when the underlying Mojo
-  /// message pipe endpoint has a message available to be read. Implementers
-  /// should read, decode, and handle the message. If [handleRead] throws
-  /// an exception derived from [Error], the exception will be thrown into the
-  /// root zone, and the application will end. Otherwise, the exception object
-  /// will be passed to [onError] if it has been set, and the exception will
-  /// not be propagated to the root zone.
-  void handleRead() {}
-
-  /// Like [handleRead] but indicating that the underlying message pipe endpoint
-  /// is ready for writing.
-  void handleWrite() {}
-
-  MojoMessagePipeEndpoint get endpoint => _endpoint;
-  bool get isOpen => _isOpen;
-  bool get isInHandler => _isInHandler;
-  bool get isBound => _endpoint != null;
-  bool get isPeerClosed => _isPeerClosed;
-
-  String toString() => "MojoEventHandler("
-      "isOpen: $_isOpen, isBound: $isBound, endpoint: $_endpoint)";
 }
diff --git a/mojo/dart/packages/mojo/lib/src/event_subscription.dart b/mojo/dart/packages/mojo/lib/src/event_subscription.dart
new file mode 100644
index 0000000..1e01f7e
--- /dev/null
+++ b/mojo/dart/packages/mojo/lib/src/event_subscription.dart
@@ -0,0 +1,129 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+part of core;
+
+class MojoEventSubscription {
+  // The underlying Mojo handle.
+  MojoHandle _handle;
+
+  // The send port that we give to the handle watcher to notify us of handle
+  // events.
+  SendPort _sendPort;
+
+  // The receive port on which we listen and receive events from the handle
+  // watcher.
+  RawReceivePort _receivePort;
+
+  // The signals on this handle that we're interested in.
+  int _signals;
+
+  // Whether subscribe() has been called.
+  bool _isSubscribed;
+
+  MojoEventSubscription(MojoHandle handle,
+      [int signals = MojoHandleSignals.kPeerClosedReadable])
+      : _handle = handle,
+        _signals = signals,
+        _isSubscribed = false {
+    if (!MojoHandle.registerFinalizer(this)) {
+      throw new MojoInternalError("Failed to register the MojoHandle.");
+    }
+  }
+
+  bool get readyRead => _handle.readyRead;
+  bool get readyWrite => _handle.readyWrite;
+  int get signals => _signals;
+
+  Future close({bool immediate: false}) => _close(immediate: immediate);
+
+  void subscribe(void handler(int event)) {
+    if (_isSubscribed) {
+      throw new MojoApiError("Already subscribed: $this.");
+    }
+    _receivePort = new RawReceivePort(handler);
+    _sendPort = _receivePort.sendPort;
+
+    if (_signals != MojoHandleSignals.kNone) {
+      int res = MojoHandleWatcher.add(_handle.h, _sendPort, _signals);
+      if (res != MojoResult.kOk) {
+        throw new MojoInternalError("MojoHandleWatcher add failed: $res");
+      }
+    }
+    _isSubscribed = true;
+  }
+
+  bool enableSignals([int signals]) {
+    if (signals != null) {
+      _signals = signals;
+    }
+    if (_isSubscribed) {
+      return MojoHandleWatcher.add(_handle.h, _sendPort, _signals) ==
+          MojoResult.kOk;
+    }
+    return false;
+  }
+
+  bool enableReadEvents() =>
+      enableSignals(MojoHandleSignals.kPeerClosedReadable);
+  bool enableWriteEvents() => enableSignals(MojoHandleSignals.kWritable);
+  bool enableAllEvents() => enableSignals(MojoHandleSignals.kReadWrite);
+
+  /// End the subscription by removing the handle from the handle watcher and
+  /// closing the Dart port, but do not close the underlying handle. The handle
+  /// can then be reused, or closed at a later time.
+  void unsubscribe({bool immediate: false}) {
+    if ((_handle == null) || !_isSubscribed || (_receivePort == null)) {
+      throw new MojoApiError("Cannont unsubscribe from a MojoEventSubscription "
+                             "that has not been subscribed to");
+    }
+    MojoHandleWatcher.remove(_handle.h);
+    _receivePort.close();
+    _receivePort = null;
+    _sendPort = null;
+    _isSubscribed = false;
+  }
+
+  @override
+  String toString() => "$_handle";
+
+  Future _close({bool immediate: false, bool local: false}) {
+    if (_handle != null) {
+      if (_isSubscribed && !local) {
+        return _handleWatcherClose(immediate: immediate).then((result) {
+          // If the handle watcher is gone, then close the handle ourselves.
+          if (result != MojoResult.kOk) {
+            _localClose();
+          }
+        });
+      } else {
+        _localClose();
+      }
+    }
+    return new Future.value(null);
+  }
+
+  Future _handleWatcherClose({bool immediate: false}) {
+    assert(_handle != null);
+    MojoHandleNatives.removeOpenHandle(_handle.h);
+    return MojoHandleWatcher.close(_handle.h, wait: !immediate).then((r) {
+      if (_receivePort != null) {
+        _receivePort.close();
+        _receivePort = null;
+      }
+      return r;
+    });
+  }
+
+  void _localClose() {
+    if (_handle != null) {
+      _handle.close();
+      _handle = null;
+    }
+    if (_receivePort != null) {
+      _receivePort.close();
+      _receivePort = null;
+    }
+  }
+}
diff --git a/mojo/dart/packages/mojo/lib/src/proxy.dart b/mojo/dart/packages/mojo/lib/src/proxy.dart
index 9ca4f13..d1d6c0b 100644
--- a/mojo/dart/packages/mojo/lib/src/proxy.dart
+++ b/mojo/dart/packages/mojo/lib/src/proxy.dart
@@ -4,13 +4,54 @@
 
 part of bindings;
 
+/// The object that [ProxyMessageHandler.errorFuture] completes with when there
+/// is an error.
 class ProxyError {
   final String message;
   ProxyError(this.message);
   String toString() => "ProxyError: $message";
 }
 
-abstract class Proxy extends core.MojoEventHandler {
+/// Generated ProxyControl classes implement this interface.
+/// ProxyControl objects are accessible through the [ctrl] field on Proxies.
+abstract class ProxyControl implements ProxyMessageHandler {
+  String get serviceName;
+}
+
+/// Generated Proxy classes extend this base class.
+class Proxy {
+  // 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 ProxyMessageHandler by way of this [ProxyControl]
+  /// object.
+  final ProxyControl ctrl;
+
+  Proxy(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 is a convenience method that simply forwards to
+  /// ctrl.responseOrError(). If a Mojo interface has a method
+  /// 'responseOrError', its name will be mangled to be 'responseOrError_'.
+  Future responseOrError(Future f) => ctrl.responseOrError(f);
+}
+
+/// 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
+/// 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 {
   HashMap<int, Completer> _completerMap = new HashMap<int, Completer>();
   Completer _errorCompleter = new Completer();
   Set<Completer> _errorCompleters;
@@ -18,14 +59,18 @@
   int _version = 0;
   int _pendingCount = 0;
 
-  Proxy.fromEndpoint(core.MojoMessagePipeEndpoint endpoint)
+  ProxyMessageHandler.fromEndpoint(core.MojoMessagePipeEndpoint endpoint)
       : super.fromEndpoint(endpoint);
 
-  Proxy.fromHandle(core.MojoHandle handle) : super.fromHandle(handle);
+  ProxyMessageHandler.fromHandle(core.MojoHandle handle)
+      : super.fromHandle(handle);
 
-  Proxy.unbound() : super.unbound();
+  ProxyMessageHandler.unbound() : super.unbound();
 
-  void handleResponse(ServiceMessage reader);
+  /// 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) {}
 
   /// If there is an error in using this proxy, this future completes with
   /// a ProxyError.
@@ -40,6 +85,7 @@
   /// Note: The description is null or incomplete if type info is unavailable.
   service_describer.ServiceDescription get description => null;
 
+  @override
   void handleRead() {
     var result = endpoint.queryAndRead();
     if ((result.data == null) || (result.dataLength == 0)) {
@@ -61,6 +107,7 @@
     }
   }
 
+  @override
   void handleWrite() {
     proxyError("Unexpected writable signal");
   }
@@ -71,9 +118,9 @@
     // complete.
     _completerMap.clear();
 
-    // Signal to any pending calls that the Proxy is closed.
+    // Signal to any pending calls that the ProxyMessageHandler is closed.
     if (_pendingCount > 0) {
-      proxyError("The Proxy is closed.");
+      proxyError("The ProxyMessageHandler is closed.");
     }
 
     return super.close(immediate: immediate);
@@ -81,7 +128,7 @@
 
   void sendMessage(Struct message, int name) {
     if (!isBound) {
-      proxyError("The Proxy is closed.");
+      proxyError("The ProxyMessageHandler is closed.");
       return;
     }
     if (!isOpen) {
@@ -99,7 +146,7 @@
   Future sendMessageWithRequestId(Struct message, int name, int id, int flags) {
     var completer = new Completer();
     if (!isBound) {
-      proxyError("The Proxy is closed.");
+      proxyError("The ProxyMessageHandler is closed.");
       return completer.future;
     }
     if (!isOpen) {
@@ -128,7 +175,7 @@
 
   String toString() {
     var superString = super.toString();
-    return "Proxy(${superString})";
+    return "ProxyMessageHandler(${superString})";
   }
 
   /// Queries the max version that the remote side supports.
@@ -186,7 +233,7 @@
   /// Example usage:
   ///
   /// try {
-  ///   result = await MyProxy.responseOrError(MyProxy.ptr.call(a,b,c));
+  ///   result = await myProxy.responseOrError(myProxy.call(a,b,c));
   /// } catch (e) {
   ///   ...
   /// }
@@ -241,20 +288,3 @@
     c.complete(response);
   }
 }
-
-/// Generated Proxy classes implement this interface.
-abstract class ProxyBase {
-  final Proxy impl = null;
-  final String serviceName = null;
-  Object get ptr;
-}
-
-/// 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
-/// ServiceConnector interface.
-abstract class ServiceConnector {
-  /// Connects [proxy] to the service called [serviceName] that lives at [url].
-  void connectToService(String url, ProxyBase proxy, [String serviceName]);
-}
diff --git a/mojo/dart/packages/mojo/sources.gni b/mojo/dart/packages/mojo/sources.gni
index 7e9fd81..5371703 100644
--- a/mojo/dart/packages/mojo/sources.gni
+++ b/mojo/dart/packages/mojo/sources.gni
@@ -34,7 +34,8 @@
                          "lib/src/data_pipe.dart",
                          "lib/src/drain_data.dart",
                          "lib/src/enum.dart",
-                         "lib/src/event_stream.dart",
+                         "lib/src/event_handler.dart",
+                         "lib/src/event_subscription.dart",
                          "lib/src/fill_data.dart",
                          "lib/src/handle.dart",
                          "lib/src/message.dart",
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 96d8bd6..7c93b28 100644
--- a/mojo/dart/packages/mojo_services/lib/activity/activity.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/activity/activity.mojom.dart
@@ -1690,24 +1690,22 @@
 }
 
 
-class _ActivityProxyImpl extends bindings.Proxy {
-  _ActivityProxyImpl.fromEndpoint(
+class _ActivityProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _ActivityProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _ActivityProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _ActivityProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _ActivityProxyImpl.unbound() : super.unbound();
-
-  static _ActivityProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _ActivityProxyImpl"));
-    return new _ActivityProxyImpl.fromEndpoint(endpoint);
-  }
+  _ActivityProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _ActivityServiceDescription();
+      new _ActivityServiceDescription();
 
+  String get serviceName => Activity.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -1717,95 +1715,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_ActivityProxyImpl($superString)";
+    return "_ActivityProxyControl($superString)";
   }
 }
 
 
-class _ActivityProxyCalls implements Activity {
-  _ActivityProxyImpl _proxyImpl;
-
-  _ActivityProxyCalls(this._proxyImpl);
-    void getUserFeedback(Object userFeedback) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _ActivityGetUserFeedbackParams();
-      params.userFeedback = userFeedback;
-      _proxyImpl.sendMessage(params, _activityMethodGetUserFeedbackName);
-    }
-    void startActivity(Intent intent) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _ActivityStartActivityParams();
-      params.intent = intent;
-      _proxyImpl.sendMessage(params, _activityMethodStartActivityName);
-    }
-    void finishCurrentActivity() {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _ActivityFinishCurrentActivityParams();
-      _proxyImpl.sendMessage(params, _activityMethodFinishCurrentActivityName);
-    }
-    void setTaskDescription(TaskDescription description) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _ActivitySetTaskDescriptionParams();
-      params.description = description;
-      _proxyImpl.sendMessage(params, _activityMethodSetTaskDescriptionName);
-    }
-    void setSystemUiVisibility(SystemUiVisibility visibility) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _ActivitySetSystemUiVisibilityParams();
-      params.visibility = visibility;
-      _proxyImpl.sendMessage(params, _activityMethodSetSystemUiVisibilityName);
-    }
-    void setRequestedOrientation(ScreenOrientation orientation) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _ActivitySetRequestedOrientationParams();
-      params.orientation = orientation;
-      _proxyImpl.sendMessage(params, _activityMethodSetRequestedOrientationName);
-    }
-}
-
-
-class ActivityProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  Activity ptr;
-
-  ActivityProxy(_ActivityProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _ActivityProxyCalls(proxyImpl);
-
+class ActivityProxy extends bindings.Proxy
+                              implements Activity {
   ActivityProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _ActivityProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _ActivityProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _ActivityProxyControl.fromEndpoint(endpoint));
 
-  ActivityProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _ActivityProxyImpl.fromHandle(handle) {
-    ptr = new _ActivityProxyCalls(impl);
-  }
+  ActivityProxy.fromHandle(core.MojoHandle handle)
+      : super(new _ActivityProxyControl.fromHandle(handle));
 
-  ActivityProxy.unbound() :
-      impl = new _ActivityProxyImpl.unbound() {
-    ptr = new _ActivityProxyCalls(impl);
+  ActivityProxy.unbound()
+      : super(new _ActivityProxyControl.unbound());
+
+  static ActivityProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ActivityProxy"));
+    return new ActivityProxy.fromEndpoint(endpoint);
   }
 
   factory ActivityProxy.connectToService(
@@ -1815,30 +1748,65 @@
     return p;
   }
 
-  static ActivityProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For ActivityProxy"));
-    return new ActivityProxy.fromEndpoint(endpoint);
+
+  void getUserFeedback(Object userFeedback) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _ActivityGetUserFeedbackParams();
+    params.userFeedback = userFeedback;
+    ctrl.sendMessage(params,
+        _activityMethodGetUserFeedbackName);
   }
-
-  String get serviceName => Activity.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
+  void startActivity(Intent intent) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _ActivityStartActivityParams();
+    params.intent = intent;
+    ctrl.sendMessage(params,
+        _activityMethodStartActivityName);
   }
-
-  String toString() {
-    return "ActivityProxy($impl)";
+  void finishCurrentActivity() {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _ActivityFinishCurrentActivityParams();
+    ctrl.sendMessage(params,
+        _activityMethodFinishCurrentActivityName);
+  }
+  void setTaskDescription(TaskDescription description) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _ActivitySetTaskDescriptionParams();
+    params.description = description;
+    ctrl.sendMessage(params,
+        _activityMethodSetTaskDescriptionName);
+  }
+  void setSystemUiVisibility(SystemUiVisibility visibility) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _ActivitySetSystemUiVisibilityParams();
+    params.visibility = visibility;
+    ctrl.sendMessage(params,
+        _activityMethodSetSystemUiVisibilityName);
+  }
+  void setRequestedOrientation(ScreenOrientation orientation) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _ActivitySetRequestedOrientationParams();
+    params.orientation = orientation;
+    ctrl.sendMessage(params,
+        _activityMethodSetRequestedOrientationName);
   }
 }
 
@@ -1971,24 +1939,22 @@
 }
 
 
-class _PathServiceProxyImpl extends bindings.Proxy {
-  _PathServiceProxyImpl.fromEndpoint(
+class _PathServiceProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _PathServiceProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _PathServiceProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _PathServiceProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _PathServiceProxyImpl.unbound() : super.unbound();
-
-  static _PathServiceProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _PathServiceProxyImpl"));
-    return new _PathServiceProxyImpl.fromEndpoint(endpoint);
-  }
+  _PathServiceProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _PathServiceServiceDescription();
+      new _PathServiceServiceDescription();
 
+  String get serviceName => PathService.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _pathServiceMethodGetAppDataDirName:
@@ -2058,66 +2024,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_PathServiceProxyImpl($superString)";
+    return "_PathServiceProxyControl($superString)";
   }
 }
 
 
-class _PathServiceProxyCalls implements PathService {
-  _PathServiceProxyImpl _proxyImpl;
-
-  _PathServiceProxyCalls(this._proxyImpl);
-    dynamic getAppDataDir([Function responseFactory = null]) {
-      var params = new _PathServiceGetAppDataDirParams();
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _pathServiceMethodGetAppDataDirName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    dynamic getFilesDir([Function responseFactory = null]) {
-      var params = new _PathServiceGetFilesDirParams();
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _pathServiceMethodGetFilesDirName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    dynamic getCacheDir([Function responseFactory = null]) {
-      var params = new _PathServiceGetCacheDirParams();
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _pathServiceMethodGetCacheDirName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-}
-
-
-class PathServiceProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  PathService ptr;
-
-  PathServiceProxy(_PathServiceProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _PathServiceProxyCalls(proxyImpl);
-
+class PathServiceProxy extends bindings.Proxy
+                              implements PathService {
   PathServiceProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _PathServiceProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _PathServiceProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _PathServiceProxyControl.fromEndpoint(endpoint));
 
-  PathServiceProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _PathServiceProxyImpl.fromHandle(handle) {
-    ptr = new _PathServiceProxyCalls(impl);
-  }
+  PathServiceProxy.fromHandle(core.MojoHandle handle)
+      : super(new _PathServiceProxyControl.fromHandle(handle));
 
-  PathServiceProxy.unbound() :
-      impl = new _PathServiceProxyImpl.unbound() {
-    ptr = new _PathServiceProxyCalls(impl);
+  PathServiceProxy.unbound()
+      : super(new _PathServiceProxyControl.unbound());
+
+  static PathServiceProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For PathServiceProxy"));
+    return new PathServiceProxy.fromEndpoint(endpoint);
   }
 
   factory PathServiceProxy.connectToService(
@@ -2127,30 +2057,30 @@
     return p;
   }
 
-  static PathServiceProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For PathServiceProxy"));
-    return new PathServiceProxy.fromEndpoint(endpoint);
+
+  dynamic getAppDataDir([Function responseFactory = null]) {
+    var params = new _PathServiceGetAppDataDirParams();
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _pathServiceMethodGetAppDataDirName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
-
-  String get serviceName => PathService.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
+  dynamic getFilesDir([Function responseFactory = null]) {
+    var params = new _PathServiceGetFilesDirParams();
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _pathServiceMethodGetFilesDirName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
-
-  String toString() {
-    return "PathServiceProxy($impl)";
+  dynamic getCacheDir([Function responseFactory = null]) {
+    var params = new _PathServiceGetCacheDirParams();
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _pathServiceMethodGetCacheDirName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
 }
 
@@ -2328,24 +2258,22 @@
 }
 
 
-class _UserFeedbackProxyImpl extends bindings.Proxy {
-  _UserFeedbackProxyImpl.fromEndpoint(
+class _UserFeedbackProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _UserFeedbackProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _UserFeedbackProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _UserFeedbackProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _UserFeedbackProxyImpl.unbound() : super.unbound();
-
-  static _UserFeedbackProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _UserFeedbackProxyImpl"));
-    return new _UserFeedbackProxyImpl.fromEndpoint(endpoint);
-  }
+  _UserFeedbackProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _UserFeedbackServiceDescription();
+      new _UserFeedbackServiceDescription();
 
+  String get serviceName => UserFeedback.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -2355,60 +2283,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_UserFeedbackProxyImpl($superString)";
+    return "_UserFeedbackProxyControl($superString)";
   }
 }
 
 
-class _UserFeedbackProxyCalls implements UserFeedback {
-  _UserFeedbackProxyImpl _proxyImpl;
-
-  _UserFeedbackProxyCalls(this._proxyImpl);
-    void performHapticFeedback(HapticFeedbackType type) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _UserFeedbackPerformHapticFeedbackParams();
-      params.type = type;
-      _proxyImpl.sendMessage(params, _userFeedbackMethodPerformHapticFeedbackName);
-    }
-    void performAuralFeedback(AuralFeedbackType type) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _UserFeedbackPerformAuralFeedbackParams();
-      params.type = type;
-      _proxyImpl.sendMessage(params, _userFeedbackMethodPerformAuralFeedbackName);
-    }
-}
-
-
-class UserFeedbackProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  UserFeedback ptr;
-
-  UserFeedbackProxy(_UserFeedbackProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _UserFeedbackProxyCalls(proxyImpl);
-
+class UserFeedbackProxy extends bindings.Proxy
+                              implements UserFeedback {
   UserFeedbackProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _UserFeedbackProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _UserFeedbackProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _UserFeedbackProxyControl.fromEndpoint(endpoint));
 
-  UserFeedbackProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _UserFeedbackProxyImpl.fromHandle(handle) {
-    ptr = new _UserFeedbackProxyCalls(impl);
-  }
+  UserFeedbackProxy.fromHandle(core.MojoHandle handle)
+      : super(new _UserFeedbackProxyControl.fromHandle(handle));
 
-  UserFeedbackProxy.unbound() :
-      impl = new _UserFeedbackProxyImpl.unbound() {
-    ptr = new _UserFeedbackProxyCalls(impl);
+  UserFeedbackProxy.unbound()
+      : super(new _UserFeedbackProxyControl.unbound());
+
+  static UserFeedbackProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For UserFeedbackProxy"));
+    return new UserFeedbackProxy.fromEndpoint(endpoint);
   }
 
   factory UserFeedbackProxy.connectToService(
@@ -2418,30 +2316,26 @@
     return p;
   }
 
-  static UserFeedbackProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For UserFeedbackProxy"));
-    return new UserFeedbackProxy.fromEndpoint(endpoint);
+
+  void performHapticFeedback(HapticFeedbackType type) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _UserFeedbackPerformHapticFeedbackParams();
+    params.type = type;
+    ctrl.sendMessage(params,
+        _userFeedbackMethodPerformHapticFeedbackName);
   }
-
-  String get serviceName => UserFeedback.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "UserFeedbackProxy($impl)";
+  void performAuralFeedback(AuralFeedbackType type) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _UserFeedbackPerformAuralFeedbackParams();
+    params.type = type;
+    ctrl.sendMessage(params,
+        _userFeedbackMethodPerformAuralFeedbackName);
   }
 }
 
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 13c6751..7aea7ff 100644
--- a/mojo/dart/packages/mojo_services/lib/authentication/authentication.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/authentication/authentication.mojom.dart
@@ -812,24 +812,22 @@
 }
 
 
-class _AuthenticationServiceProxyImpl extends bindings.Proxy {
-  _AuthenticationServiceProxyImpl.fromEndpoint(
+class _AuthenticationServiceProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _AuthenticationServiceProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _AuthenticationServiceProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _AuthenticationServiceProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _AuthenticationServiceProxyImpl.unbound() : super.unbound();
-
-  static _AuthenticationServiceProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _AuthenticationServiceProxyImpl"));
-    return new _AuthenticationServiceProxyImpl.fromEndpoint(endpoint);
-  }
+  _AuthenticationServiceProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _AuthenticationServiceServiceDescription();
+      new _AuthenticationServiceServiceDescription();
 
+  String get serviceName => AuthenticationService.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _authenticationServiceMethodSelectAccountName:
@@ -919,88 +917,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_AuthenticationServiceProxyImpl($superString)";
+    return "_AuthenticationServiceProxyControl($superString)";
   }
 }
 
 
-class _AuthenticationServiceProxyCalls implements AuthenticationService {
-  _AuthenticationServiceProxyImpl _proxyImpl;
-
-  _AuthenticationServiceProxyCalls(this._proxyImpl);
-    dynamic selectAccount(bool returnLastSelected,[Function responseFactory = null]) {
-      var params = new _AuthenticationServiceSelectAccountParams();
-      params.returnLastSelected = returnLastSelected;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _authenticationServiceMethodSelectAccountName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    dynamic getOAuth2Token(String username,List<String> scopes,[Function responseFactory = null]) {
-      var params = new _AuthenticationServiceGetOAuth2TokenParams();
-      params.username = username;
-      params.scopes = scopes;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _authenticationServiceMethodGetOAuth2TokenName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    void clearOAuth2Token(String token) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _AuthenticationServiceClearOAuth2TokenParams();
-      params.token = token;
-      _proxyImpl.sendMessage(params, _authenticationServiceMethodClearOAuth2TokenName);
-    }
-    dynamic getOAuth2DeviceCode(List<String> scopes,[Function responseFactory = null]) {
-      var params = new _AuthenticationServiceGetOAuth2DeviceCodeParams();
-      params.scopes = scopes;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _authenticationServiceMethodGetOAuth2DeviceCodeName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    dynamic addAccount(String deviceCode,[Function responseFactory = null]) {
-      var params = new _AuthenticationServiceAddAccountParams();
-      params.deviceCode = deviceCode;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _authenticationServiceMethodAddAccountName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-}
-
-
-class AuthenticationServiceProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  AuthenticationService ptr;
-
-  AuthenticationServiceProxy(_AuthenticationServiceProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _AuthenticationServiceProxyCalls(proxyImpl);
-
+class AuthenticationServiceProxy extends bindings.Proxy
+                              implements AuthenticationService {
   AuthenticationServiceProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _AuthenticationServiceProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _AuthenticationServiceProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _AuthenticationServiceProxyControl.fromEndpoint(endpoint));
 
-  AuthenticationServiceProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _AuthenticationServiceProxyImpl.fromHandle(handle) {
-    ptr = new _AuthenticationServiceProxyCalls(impl);
-  }
+  AuthenticationServiceProxy.fromHandle(core.MojoHandle handle)
+      : super(new _AuthenticationServiceProxyControl.fromHandle(handle));
 
-  AuthenticationServiceProxy.unbound() :
-      impl = new _AuthenticationServiceProxyImpl.unbound() {
-    ptr = new _AuthenticationServiceProxyCalls(impl);
+  AuthenticationServiceProxy.unbound()
+      : super(new _AuthenticationServiceProxyControl.unbound());
+
+  static AuthenticationServiceProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For AuthenticationServiceProxy"));
+    return new AuthenticationServiceProxy.fromEndpoint(endpoint);
   }
 
   factory AuthenticationServiceProxy.connectToService(
@@ -1010,30 +950,53 @@
     return p;
   }
 
-  static AuthenticationServiceProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For AuthenticationServiceProxy"));
-    return new AuthenticationServiceProxy.fromEndpoint(endpoint);
+
+  dynamic selectAccount(bool returnLastSelected,[Function responseFactory = null]) {
+    var params = new _AuthenticationServiceSelectAccountParams();
+    params.returnLastSelected = returnLastSelected;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _authenticationServiceMethodSelectAccountName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
-
-  String get serviceName => AuthenticationService.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
+  dynamic getOAuth2Token(String username,List<String> scopes,[Function responseFactory = null]) {
+    var params = new _AuthenticationServiceGetOAuth2TokenParams();
+    params.username = username;
+    params.scopes = scopes;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _authenticationServiceMethodGetOAuth2TokenName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
-
-  String toString() {
-    return "AuthenticationServiceProxy($impl)";
+  void clearOAuth2Token(String token) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _AuthenticationServiceClearOAuth2TokenParams();
+    params.token = token;
+    ctrl.sendMessage(params,
+        _authenticationServiceMethodClearOAuth2TokenName);
+  }
+  dynamic getOAuth2DeviceCode(List<String> scopes,[Function responseFactory = null]) {
+    var params = new _AuthenticationServiceGetOAuth2DeviceCodeParams();
+    params.scopes = scopes;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _authenticationServiceMethodGetOAuth2DeviceCodeName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
+  }
+  dynamic addAccount(String deviceCode,[Function responseFactory = null]) {
+    var params = new _AuthenticationServiceAddAccountParams();
+    params.deviceCode = deviceCode;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _authenticationServiceMethodAddAccountName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
 }
 
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 28b0c9b..398eb08 100644
--- a/mojo/dart/packages/mojo_services/lib/contacts/contacts.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/contacts/contacts.mojom.dart
@@ -769,24 +769,22 @@
 }
 
 
-class _ContactsServiceProxyImpl extends bindings.Proxy {
-  _ContactsServiceProxyImpl.fromEndpoint(
+class _ContactsServiceProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _ContactsServiceProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _ContactsServiceProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _ContactsServiceProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _ContactsServiceProxyImpl.unbound() : super.unbound();
-
-  static _ContactsServiceProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _ContactsServiceProxyImpl"));
-    return new _ContactsServiceProxyImpl.fromEndpoint(endpoint);
-  }
+  _ContactsServiceProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _ContactsServiceServiceDescription();
+      new _ContactsServiceServiceDescription();
 
+  String get serviceName => ContactsService.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _contactsServiceMethodGetCountName:
@@ -876,81 +874,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_ContactsServiceProxyImpl($superString)";
+    return "_ContactsServiceProxyControl($superString)";
   }
 }
 
 
-class _ContactsServiceProxyCalls implements ContactsService {
-  _ContactsServiceProxyImpl _proxyImpl;
-
-  _ContactsServiceProxyCalls(this._proxyImpl);
-    dynamic getCount(String filter,[Function responseFactory = null]) {
-      var params = new _ContactsServiceGetCountParams();
-      params.filter = filter;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _contactsServiceMethodGetCountName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    dynamic get(String filter,int offset,int limit,[Function responseFactory = null]) {
-      var params = new _ContactsServiceGetParams();
-      params.filter = filter;
-      params.offset = offset;
-      params.limit = limit;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _contactsServiceMethodGetName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    dynamic getEmails(int id,[Function responseFactory = null]) {
-      var params = new _ContactsServiceGetEmailsParams();
-      params.id = id;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _contactsServiceMethodGetEmailsName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    dynamic getPhoto(int id,bool highResolution,[Function responseFactory = null]) {
-      var params = new _ContactsServiceGetPhotoParams();
-      params.id = id;
-      params.highResolution = highResolution;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _contactsServiceMethodGetPhotoName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-}
-
-
-class ContactsServiceProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  ContactsService ptr;
-
-  ContactsServiceProxy(_ContactsServiceProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _ContactsServiceProxyCalls(proxyImpl);
-
+class ContactsServiceProxy extends bindings.Proxy
+                              implements ContactsService {
   ContactsServiceProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _ContactsServiceProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _ContactsServiceProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _ContactsServiceProxyControl.fromEndpoint(endpoint));
 
-  ContactsServiceProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _ContactsServiceProxyImpl.fromHandle(handle) {
-    ptr = new _ContactsServiceProxyCalls(impl);
-  }
+  ContactsServiceProxy.fromHandle(core.MojoHandle handle)
+      : super(new _ContactsServiceProxyControl.fromHandle(handle));
 
-  ContactsServiceProxy.unbound() :
-      impl = new _ContactsServiceProxyImpl.unbound() {
-    ptr = new _ContactsServiceProxyCalls(impl);
+  ContactsServiceProxy.unbound()
+      : super(new _ContactsServiceProxyControl.unbound());
+
+  static ContactsServiceProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ContactsServiceProxy"));
+    return new ContactsServiceProxy.fromEndpoint(endpoint);
   }
 
   factory ContactsServiceProxy.connectToService(
@@ -960,30 +907,45 @@
     return p;
   }
 
-  static ContactsServiceProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For ContactsServiceProxy"));
-    return new ContactsServiceProxy.fromEndpoint(endpoint);
+
+  dynamic getCount(String filter,[Function responseFactory = null]) {
+    var params = new _ContactsServiceGetCountParams();
+    params.filter = filter;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _contactsServiceMethodGetCountName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
-
-  String get serviceName => ContactsService.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
+  dynamic get(String filter,int offset,int limit,[Function responseFactory = null]) {
+    var params = new _ContactsServiceGetParams();
+    params.filter = filter;
+    params.offset = offset;
+    params.limit = limit;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _contactsServiceMethodGetName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
-
-  String toString() {
-    return "ContactsServiceProxy($impl)";
+  dynamic getEmails(int id,[Function responseFactory = null]) {
+    var params = new _ContactsServiceGetEmailsParams();
+    params.id = id;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _contactsServiceMethodGetEmailsName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
+  }
+  dynamic getPhoto(int id,bool highResolution,[Function responseFactory = null]) {
+    var params = new _ContactsServiceGetPhotoParams();
+    params.id = id;
+    params.highResolution = highResolution;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _contactsServiceMethodGetPhotoName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
 }
 
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 e000d73..290846c 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
@@ -462,24 +462,22 @@
 }
 
 
-class _HttpServerProxyImpl extends bindings.Proxy {
-  _HttpServerProxyImpl.fromEndpoint(
+class _HttpServerProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _HttpServerProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _HttpServerProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _HttpServerProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _HttpServerProxyImpl.unbound() : super.unbound();
-
-  static _HttpServerProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _HttpServerProxyImpl"));
-    return new _HttpServerProxyImpl.fromEndpoint(endpoint);
-  }
+  _HttpServerProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _HttpServerServiceDescription();
+      new _HttpServerServiceDescription();
 
+  String get serviceName => HttpServer.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _httpServerMethodSetHandlerName:
@@ -529,60 +527,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_HttpServerProxyImpl($superString)";
+    return "_HttpServerProxyControl($superString)";
   }
 }
 
 
-class _HttpServerProxyCalls implements HttpServer {
-  _HttpServerProxyImpl _proxyImpl;
-
-  _HttpServerProxyCalls(this._proxyImpl);
-    dynamic setHandler(String pattern,Object handler,[Function responseFactory = null]) {
-      var params = new _HttpServerSetHandlerParams();
-      params.pattern = pattern;
-      params.handler = handler;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _httpServerMethodSetHandlerName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    dynamic getPort([Function responseFactory = null]) {
-      var params = new _HttpServerGetPortParams();
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _httpServerMethodGetPortName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-}
-
-
-class HttpServerProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  HttpServer ptr;
-
-  HttpServerProxy(_HttpServerProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _HttpServerProxyCalls(proxyImpl);
-
+class HttpServerProxy extends bindings.Proxy
+                              implements HttpServer {
   HttpServerProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _HttpServerProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _HttpServerProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _HttpServerProxyControl.fromEndpoint(endpoint));
 
-  HttpServerProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _HttpServerProxyImpl.fromHandle(handle) {
-    ptr = new _HttpServerProxyCalls(impl);
-  }
+  HttpServerProxy.fromHandle(core.MojoHandle handle)
+      : super(new _HttpServerProxyControl.fromHandle(handle));
 
-  HttpServerProxy.unbound() :
-      impl = new _HttpServerProxyImpl.unbound() {
-    ptr = new _HttpServerProxyCalls(impl);
+  HttpServerProxy.unbound()
+      : super(new _HttpServerProxyControl.unbound());
+
+  static HttpServerProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For HttpServerProxy"));
+    return new HttpServerProxy.fromEndpoint(endpoint);
   }
 
   factory HttpServerProxy.connectToService(
@@ -592,30 +560,24 @@
     return p;
   }
 
-  static HttpServerProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For HttpServerProxy"));
-    return new HttpServerProxy.fromEndpoint(endpoint);
+
+  dynamic setHandler(String pattern,Object handler,[Function responseFactory = null]) {
+    var params = new _HttpServerSetHandlerParams();
+    params.pattern = pattern;
+    params.handler = handler;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _httpServerMethodSetHandlerName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
-
-  String get serviceName => HttpServer.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "HttpServerProxy($impl)";
+  dynamic getPort([Function responseFactory = null]) {
+    var params = new _HttpServerGetPortParams();
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _httpServerMethodGetPortName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
 }
 
@@ -768,24 +730,22 @@
 }
 
 
-class _HttpHandlerProxyImpl extends bindings.Proxy {
-  _HttpHandlerProxyImpl.fromEndpoint(
+class _HttpHandlerProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _HttpHandlerProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _HttpHandlerProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _HttpHandlerProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _HttpHandlerProxyImpl.unbound() : super.unbound();
-
-  static _HttpHandlerProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _HttpHandlerProxyImpl"));
-    return new _HttpHandlerProxyImpl.fromEndpoint(endpoint);
-  }
+  _HttpHandlerProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _HttpHandlerServiceDescription();
+      new _HttpHandlerServiceDescription();
 
+  String get serviceName => HttpHandler.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _httpHandlerMethodHandleRequestName:
@@ -815,51 +775,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_HttpHandlerProxyImpl($superString)";
+    return "_HttpHandlerProxyControl($superString)";
   }
 }
 
 
-class _HttpHandlerProxyCalls implements HttpHandler {
-  _HttpHandlerProxyImpl _proxyImpl;
-
-  _HttpHandlerProxyCalls(this._proxyImpl);
-    dynamic handleRequest(http_request_mojom.HttpRequest request,[Function responseFactory = null]) {
-      var params = new _HttpHandlerHandleRequestParams();
-      params.request = request;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _httpHandlerMethodHandleRequestName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-}
-
-
-class HttpHandlerProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  HttpHandler ptr;
-
-  HttpHandlerProxy(_HttpHandlerProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _HttpHandlerProxyCalls(proxyImpl);
-
+class HttpHandlerProxy extends bindings.Proxy
+                              implements HttpHandler {
   HttpHandlerProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _HttpHandlerProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _HttpHandlerProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _HttpHandlerProxyControl.fromEndpoint(endpoint));
 
-  HttpHandlerProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _HttpHandlerProxyImpl.fromHandle(handle) {
-    ptr = new _HttpHandlerProxyCalls(impl);
-  }
+  HttpHandlerProxy.fromHandle(core.MojoHandle handle)
+      : super(new _HttpHandlerProxyControl.fromHandle(handle));
 
-  HttpHandlerProxy.unbound() :
-      impl = new _HttpHandlerProxyImpl.unbound() {
-    ptr = new _HttpHandlerProxyCalls(impl);
+  HttpHandlerProxy.unbound()
+      : super(new _HttpHandlerProxyControl.unbound());
+
+  static HttpHandlerProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For HttpHandlerProxy"));
+    return new HttpHandlerProxy.fromEndpoint(endpoint);
   }
 
   factory HttpHandlerProxy.connectToService(
@@ -869,30 +808,15 @@
     return p;
   }
 
-  static HttpHandlerProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For HttpHandlerProxy"));
-    return new HttpHandlerProxy.fromEndpoint(endpoint);
-  }
 
-  String get serviceName => HttpHandler.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "HttpHandlerProxy($impl)";
+  dynamic handleRequest(http_request_mojom.HttpRequest request,[Function responseFactory = null]) {
+    var params = new _HttpHandlerHandleRequestParams();
+    params.request = request;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _httpHandlerMethodHandleRequestName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
 }
 
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 cd8a66a..fd0b2d2 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
@@ -115,24 +115,22 @@
 }
 
 
-class _HttpServerFactoryProxyImpl extends bindings.Proxy {
-  _HttpServerFactoryProxyImpl.fromEndpoint(
+class _HttpServerFactoryProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _HttpServerFactoryProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _HttpServerFactoryProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _HttpServerFactoryProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _HttpServerFactoryProxyImpl.unbound() : super.unbound();
-
-  static _HttpServerFactoryProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _HttpServerFactoryProxyImpl"));
-    return new _HttpServerFactoryProxyImpl.fromEndpoint(endpoint);
-  }
+  _HttpServerFactoryProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _HttpServerFactoryServiceDescription();
+      new _HttpServerFactoryServiceDescription();
 
+  String get serviceName => HttpServerFactory.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -142,52 +140,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_HttpServerFactoryProxyImpl($superString)";
+    return "_HttpServerFactoryProxyControl($superString)";
   }
 }
 
 
-class _HttpServerFactoryProxyCalls implements HttpServerFactory {
-  _HttpServerFactoryProxyImpl _proxyImpl;
-
-  _HttpServerFactoryProxyCalls(this._proxyImpl);
-    void createHttpServer(Object serverRequest, net_address_mojom.NetAddress localAddress) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _HttpServerFactoryCreateHttpServerParams();
-      params.serverRequest = serverRequest;
-      params.localAddress = localAddress;
-      _proxyImpl.sendMessage(params, _httpServerFactoryMethodCreateHttpServerName);
-    }
-}
-
-
-class HttpServerFactoryProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  HttpServerFactory ptr;
-
-  HttpServerFactoryProxy(_HttpServerFactoryProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _HttpServerFactoryProxyCalls(proxyImpl);
-
+class HttpServerFactoryProxy extends bindings.Proxy
+                              implements HttpServerFactory {
   HttpServerFactoryProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _HttpServerFactoryProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _HttpServerFactoryProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _HttpServerFactoryProxyControl.fromEndpoint(endpoint));
 
-  HttpServerFactoryProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _HttpServerFactoryProxyImpl.fromHandle(handle) {
-    ptr = new _HttpServerFactoryProxyCalls(impl);
-  }
+  HttpServerFactoryProxy.fromHandle(core.MojoHandle handle)
+      : super(new _HttpServerFactoryProxyControl.fromHandle(handle));
 
-  HttpServerFactoryProxy.unbound() :
-      impl = new _HttpServerFactoryProxyImpl.unbound() {
-    ptr = new _HttpServerFactoryProxyCalls(impl);
+  HttpServerFactoryProxy.unbound()
+      : super(new _HttpServerFactoryProxyControl.unbound());
+
+  static HttpServerFactoryProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For HttpServerFactoryProxy"));
+    return new HttpServerFactoryProxy.fromEndpoint(endpoint);
   }
 
   factory HttpServerFactoryProxy.connectToService(
@@ -197,30 +173,17 @@
     return p;
   }
 
-  static HttpServerFactoryProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For HttpServerFactoryProxy"));
-    return new HttpServerFactoryProxy.fromEndpoint(endpoint);
-  }
 
-  String get serviceName => HttpServerFactory.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "HttpServerFactoryProxy($impl)";
+  void createHttpServer(Object serverRequest, net_address_mojom.NetAddress localAddress) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _HttpServerFactoryCreateHttpServerParams();
+    params.serverRequest = serverRequest;
+    params.localAddress = localAddress;
+    ctrl.sendMessage(params,
+        _httpServerFactoryMethodCreateHttpServerName);
   }
 }
 
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 29e49c1..f5766f7 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
@@ -171,24 +171,22 @@
 }
 
 
-class _IcuDataProxyImpl extends bindings.Proxy {
-  _IcuDataProxyImpl.fromEndpoint(
+class _IcuDataProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _IcuDataProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _IcuDataProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _IcuDataProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _IcuDataProxyImpl.unbound() : super.unbound();
-
-  static _IcuDataProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _IcuDataProxyImpl"));
-    return new _IcuDataProxyImpl.fromEndpoint(endpoint);
-  }
+  _IcuDataProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _IcuDataServiceDescription();
+      new _IcuDataServiceDescription();
 
+  String get serviceName => IcuData.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _icuDataMethodMapName:
@@ -218,51 +216,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_IcuDataProxyImpl($superString)";
+    return "_IcuDataProxyControl($superString)";
   }
 }
 
 
-class _IcuDataProxyCalls implements IcuData {
-  _IcuDataProxyImpl _proxyImpl;
-
-  _IcuDataProxyCalls(this._proxyImpl);
-    dynamic map(String sha1hash,[Function responseFactory = null]) {
-      var params = new _IcuDataMapParams();
-      params.sha1hash = sha1hash;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _icuDataMethodMapName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-}
-
-
-class IcuDataProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  IcuData ptr;
-
-  IcuDataProxy(_IcuDataProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _IcuDataProxyCalls(proxyImpl);
-
+class IcuDataProxy extends bindings.Proxy
+                              implements IcuData {
   IcuDataProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _IcuDataProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _IcuDataProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _IcuDataProxyControl.fromEndpoint(endpoint));
 
-  IcuDataProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _IcuDataProxyImpl.fromHandle(handle) {
-    ptr = new _IcuDataProxyCalls(impl);
-  }
+  IcuDataProxy.fromHandle(core.MojoHandle handle)
+      : super(new _IcuDataProxyControl.fromHandle(handle));
 
-  IcuDataProxy.unbound() :
-      impl = new _IcuDataProxyImpl.unbound() {
-    ptr = new _IcuDataProxyCalls(impl);
+  IcuDataProxy.unbound()
+      : super(new _IcuDataProxyControl.unbound());
+
+  static IcuDataProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For IcuDataProxy"));
+    return new IcuDataProxy.fromEndpoint(endpoint);
   }
 
   factory IcuDataProxy.connectToService(
@@ -272,30 +249,15 @@
     return p;
   }
 
-  static IcuDataProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For IcuDataProxy"));
-    return new IcuDataProxy.fromEndpoint(endpoint);
-  }
 
-  String get serviceName => IcuData.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "IcuDataProxy($impl)";
+  dynamic map(String sha1hash,[Function responseFactory = null]) {
+    var params = new _IcuDataMapParams();
+    params.sha1hash = sha1hash;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _icuDataMethodMapName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
 }
 
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 c126f46..3bf43d9 100644
--- a/mojo/dart/packages/mojo_services/lib/input/input.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/input/input.mojom.dart
@@ -215,24 +215,22 @@
 }
 
 
-class _InputClientProxyImpl extends bindings.Proxy {
-  _InputClientProxyImpl.fromEndpoint(
+class _InputClientProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _InputClientProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _InputClientProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _InputClientProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _InputClientProxyImpl.unbound() : super.unbound();
-
-  static _InputClientProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _InputClientProxyImpl"));
-    return new _InputClientProxyImpl.fromEndpoint(endpoint);
-  }
+  _InputClientProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _InputClientServiceDescription();
+      new _InputClientServiceDescription();
 
+  String get serviceName => InputClient.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _inputClientMethodOnBackButtonName:
@@ -262,50 +260,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_InputClientProxyImpl($superString)";
+    return "_InputClientProxyControl($superString)";
   }
 }
 
 
-class _InputClientProxyCalls implements InputClient {
-  _InputClientProxyImpl _proxyImpl;
-
-  _InputClientProxyCalls(this._proxyImpl);
-    dynamic onBackButton([Function responseFactory = null]) {
-      var params = new _InputClientOnBackButtonParams();
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _inputClientMethodOnBackButtonName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-}
-
-
-class InputClientProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  InputClient ptr;
-
-  InputClientProxy(_InputClientProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _InputClientProxyCalls(proxyImpl);
-
+class InputClientProxy extends bindings.Proxy
+                              implements InputClient {
   InputClientProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _InputClientProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _InputClientProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _InputClientProxyControl.fromEndpoint(endpoint));
 
-  InputClientProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _InputClientProxyImpl.fromHandle(handle) {
-    ptr = new _InputClientProxyCalls(impl);
-  }
+  InputClientProxy.fromHandle(core.MojoHandle handle)
+      : super(new _InputClientProxyControl.fromHandle(handle));
 
-  InputClientProxy.unbound() :
-      impl = new _InputClientProxyImpl.unbound() {
-    ptr = new _InputClientProxyCalls(impl);
+  InputClientProxy.unbound()
+      : super(new _InputClientProxyControl.unbound());
+
+  static InputClientProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For InputClientProxy"));
+    return new InputClientProxy.fromEndpoint(endpoint);
   }
 
   factory InputClientProxy.connectToService(
@@ -315,30 +293,14 @@
     return p;
   }
 
-  static InputClientProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For InputClientProxy"));
-    return new InputClientProxy.fromEndpoint(endpoint);
-  }
 
-  String get serviceName => InputClient.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "InputClientProxy($impl)";
+  dynamic onBackButton([Function responseFactory = null]) {
+    var params = new _InputClientOnBackButtonParams();
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _inputClientMethodOnBackButtonName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
 }
 
@@ -463,24 +425,22 @@
 }
 
 
-class _InputServiceProxyImpl extends bindings.Proxy {
-  _InputServiceProxyImpl.fromEndpoint(
+class _InputServiceProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _InputServiceProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _InputServiceProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _InputServiceProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _InputServiceProxyImpl.unbound() : super.unbound();
-
-  static _InputServiceProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _InputServiceProxyImpl"));
-    return new _InputServiceProxyImpl.fromEndpoint(endpoint);
-  }
+  _InputServiceProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _InputServiceServiceDescription();
+      new _InputServiceServiceDescription();
 
+  String get serviceName => InputService.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -490,51 +450,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_InputServiceProxyImpl($superString)";
+    return "_InputServiceProxyControl($superString)";
   }
 }
 
 
-class _InputServiceProxyCalls implements InputService {
-  _InputServiceProxyImpl _proxyImpl;
-
-  _InputServiceProxyCalls(this._proxyImpl);
-    void setClient(Object client) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _InputServiceSetClientParams();
-      params.client = client;
-      _proxyImpl.sendMessage(params, _inputServiceMethodSetClientName);
-    }
-}
-
-
-class InputServiceProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  InputService ptr;
-
-  InputServiceProxy(_InputServiceProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _InputServiceProxyCalls(proxyImpl);
-
+class InputServiceProxy extends bindings.Proxy
+                              implements InputService {
   InputServiceProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _InputServiceProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _InputServiceProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _InputServiceProxyControl.fromEndpoint(endpoint));
 
-  InputServiceProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _InputServiceProxyImpl.fromHandle(handle) {
-    ptr = new _InputServiceProxyCalls(impl);
-  }
+  InputServiceProxy.fromHandle(core.MojoHandle handle)
+      : super(new _InputServiceProxyControl.fromHandle(handle));
 
-  InputServiceProxy.unbound() :
-      impl = new _InputServiceProxyImpl.unbound() {
-    ptr = new _InputServiceProxyCalls(impl);
+  InputServiceProxy.unbound()
+      : super(new _InputServiceProxyControl.unbound());
+
+  static InputServiceProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For InputServiceProxy"));
+    return new InputServiceProxy.fromEndpoint(endpoint);
   }
 
   factory InputServiceProxy.connectToService(
@@ -544,30 +483,16 @@
     return p;
   }
 
-  static InputServiceProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For InputServiceProxy"));
-    return new InputServiceProxy.fromEndpoint(endpoint);
-  }
 
-  String get serviceName => InputService.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "InputServiceProxy($impl)";
+  void setClient(Object client) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _InputServiceSetClientParams();
+    params.client = client;
+    ctrl.sendMessage(params,
+        _inputServiceMethodSetClientName);
   }
 }
 
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 152aa29..6f547c5 100644
--- a/mojo/dart/packages/mojo_services/lib/keyboard/keyboard.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/keyboard/keyboard.mojom.dart
@@ -1466,24 +1466,22 @@
 }
 
 
-class _KeyboardClientProxyImpl extends bindings.Proxy {
-  _KeyboardClientProxyImpl.fromEndpoint(
+class _KeyboardClientProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _KeyboardClientProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _KeyboardClientProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _KeyboardClientProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _KeyboardClientProxyImpl.unbound() : super.unbound();
-
-  static _KeyboardClientProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _KeyboardClientProxyImpl"));
-    return new _KeyboardClientProxyImpl.fromEndpoint(endpoint);
-  }
+  _KeyboardClientProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _KeyboardClientServiceDescription();
+      new _KeyboardClientServiceDescription();
 
+  String get serviceName => KeyboardClient.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -1493,119 +1491,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_KeyboardClientProxyImpl($superString)";
+    return "_KeyboardClientProxyControl($superString)";
   }
 }
 
 
-class _KeyboardClientProxyCalls implements KeyboardClient {
-  _KeyboardClientProxyImpl _proxyImpl;
-
-  _KeyboardClientProxyCalls(this._proxyImpl);
-    void commitCompletion(CompletionData completion) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _KeyboardClientCommitCompletionParams();
-      params.completion = completion;
-      _proxyImpl.sendMessage(params, _keyboardClientMethodCommitCompletionName);
-    }
-    void commitCorrection(CorrectionData correction) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _KeyboardClientCommitCorrectionParams();
-      params.correction = correction;
-      _proxyImpl.sendMessage(params, _keyboardClientMethodCommitCorrectionName);
-    }
-    void commitText(String text, int newCursorPosition) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _KeyboardClientCommitTextParams();
-      params.text = text;
-      params.newCursorPosition = newCursorPosition;
-      _proxyImpl.sendMessage(params, _keyboardClientMethodCommitTextName);
-    }
-    void deleteSurroundingText(int beforeLength, int afterLength) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _KeyboardClientDeleteSurroundingTextParams();
-      params.beforeLength = beforeLength;
-      params.afterLength = afterLength;
-      _proxyImpl.sendMessage(params, _keyboardClientMethodDeleteSurroundingTextName);
-    }
-    void setComposingRegion(int start, int end) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _KeyboardClientSetComposingRegionParams();
-      params.start = start;
-      params.end = end;
-      _proxyImpl.sendMessage(params, _keyboardClientMethodSetComposingRegionName);
-    }
-    void setComposingText(String text, int newCursorPosition) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _KeyboardClientSetComposingTextParams();
-      params.text = text;
-      params.newCursorPosition = newCursorPosition;
-      _proxyImpl.sendMessage(params, _keyboardClientMethodSetComposingTextName);
-    }
-    void setSelection(int start, int end) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _KeyboardClientSetSelectionParams();
-      params.start = start;
-      params.end = end;
-      _proxyImpl.sendMessage(params, _keyboardClientMethodSetSelectionName);
-    }
-    void submit(SubmitAction action) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _KeyboardClientSubmitParams();
-      params.action = action;
-      _proxyImpl.sendMessage(params, _keyboardClientMethodSubmitName);
-    }
-}
-
-
-class KeyboardClientProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  KeyboardClient ptr;
-
-  KeyboardClientProxy(_KeyboardClientProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _KeyboardClientProxyCalls(proxyImpl);
-
+class KeyboardClientProxy extends bindings.Proxy
+                              implements KeyboardClient {
   KeyboardClientProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _KeyboardClientProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _KeyboardClientProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _KeyboardClientProxyControl.fromEndpoint(endpoint));
 
-  KeyboardClientProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _KeyboardClientProxyImpl.fromHandle(handle) {
-    ptr = new _KeyboardClientProxyCalls(impl);
-  }
+  KeyboardClientProxy.fromHandle(core.MojoHandle handle)
+      : super(new _KeyboardClientProxyControl.fromHandle(handle));
 
-  KeyboardClientProxy.unbound() :
-      impl = new _KeyboardClientProxyImpl.unbound() {
-    ptr = new _KeyboardClientProxyCalls(impl);
+  KeyboardClientProxy.unbound()
+      : super(new _KeyboardClientProxyControl.unbound());
+
+  static KeyboardClientProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For KeyboardClientProxy"));
+    return new KeyboardClientProxy.fromEndpoint(endpoint);
   }
 
   factory KeyboardClientProxy.connectToService(
@@ -1615,30 +1524,91 @@
     return p;
   }
 
-  static KeyboardClientProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For KeyboardClientProxy"));
-    return new KeyboardClientProxy.fromEndpoint(endpoint);
+
+  void commitCompletion(CompletionData completion) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _KeyboardClientCommitCompletionParams();
+    params.completion = completion;
+    ctrl.sendMessage(params,
+        _keyboardClientMethodCommitCompletionName);
   }
-
-  String get serviceName => KeyboardClient.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
+  void commitCorrection(CorrectionData correction) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _KeyboardClientCommitCorrectionParams();
+    params.correction = correction;
+    ctrl.sendMessage(params,
+        _keyboardClientMethodCommitCorrectionName);
   }
-
-  String toString() {
-    return "KeyboardClientProxy($impl)";
+  void commitText(String text, int newCursorPosition) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _KeyboardClientCommitTextParams();
+    params.text = text;
+    params.newCursorPosition = newCursorPosition;
+    ctrl.sendMessage(params,
+        _keyboardClientMethodCommitTextName);
+  }
+  void deleteSurroundingText(int beforeLength, int afterLength) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _KeyboardClientDeleteSurroundingTextParams();
+    params.beforeLength = beforeLength;
+    params.afterLength = afterLength;
+    ctrl.sendMessage(params,
+        _keyboardClientMethodDeleteSurroundingTextName);
+  }
+  void setComposingRegion(int start, int end) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _KeyboardClientSetComposingRegionParams();
+    params.start = start;
+    params.end = end;
+    ctrl.sendMessage(params,
+        _keyboardClientMethodSetComposingRegionName);
+  }
+  void setComposingText(String text, int newCursorPosition) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _KeyboardClientSetComposingTextParams();
+    params.text = text;
+    params.newCursorPosition = newCursorPosition;
+    ctrl.sendMessage(params,
+        _keyboardClientMethodSetComposingTextName);
+  }
+  void setSelection(int start, int end) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _KeyboardClientSetSelectionParams();
+    params.start = start;
+    params.end = end;
+    ctrl.sendMessage(params,
+        _keyboardClientMethodSetSelectionName);
+  }
+  void submit(SubmitAction action) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _KeyboardClientSubmitParams();
+    params.action = action;
+    ctrl.sendMessage(params,
+        _keyboardClientMethodSubmitName);
   }
 }
 
@@ -1787,24 +1757,22 @@
 }
 
 
-class _KeyboardServiceProxyImpl extends bindings.Proxy {
-  _KeyboardServiceProxyImpl.fromEndpoint(
+class _KeyboardServiceProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _KeyboardServiceProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _KeyboardServiceProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _KeyboardServiceProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _KeyboardServiceProxyImpl.unbound() : super.unbound();
-
-  static _KeyboardServiceProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _KeyboardServiceProxyImpl"));
-    return new _KeyboardServiceProxyImpl.fromEndpoint(endpoint);
-  }
+  _KeyboardServiceProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _KeyboardServiceServiceDescription();
+      new _KeyboardServiceServiceDescription();
 
+  String get serviceName => KeyboardService.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -1814,87 +1782,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_KeyboardServiceProxyImpl($superString)";
+    return "_KeyboardServiceProxyControl($superString)";
   }
 }
 
 
-class _KeyboardServiceProxyCalls implements KeyboardService {
-  _KeyboardServiceProxyImpl _proxyImpl;
-
-  _KeyboardServiceProxyCalls(this._proxyImpl);
-    void show(Object client, KeyboardType type) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _KeyboardServiceShowParams();
-      params.client = client;
-      params.type = type;
-      _proxyImpl.sendMessage(params, _keyboardServiceMethodShowName);
-    }
-    void showByRequest() {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _KeyboardServiceShowByRequestParams();
-      _proxyImpl.sendMessage(params, _keyboardServiceMethodShowByRequestName);
-    }
-    void hide() {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _KeyboardServiceHideParams();
-      _proxyImpl.sendMessage(params, _keyboardServiceMethodHideName);
-    }
-    void setText(String text) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _KeyboardServiceSetTextParams();
-      params.text = text;
-      _proxyImpl.sendMessage(params, _keyboardServiceMethodSetTextName);
-    }
-    void setSelection(int start, int end) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _KeyboardServiceSetSelectionParams();
-      params.start = start;
-      params.end = end;
-      _proxyImpl.sendMessage(params, _keyboardServiceMethodSetSelectionName);
-    }
-}
-
-
-class KeyboardServiceProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  KeyboardService ptr;
-
-  KeyboardServiceProxy(_KeyboardServiceProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _KeyboardServiceProxyCalls(proxyImpl);
-
+class KeyboardServiceProxy extends bindings.Proxy
+                              implements KeyboardService {
   KeyboardServiceProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _KeyboardServiceProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _KeyboardServiceProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _KeyboardServiceProxyControl.fromEndpoint(endpoint));
 
-  KeyboardServiceProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _KeyboardServiceProxyImpl.fromHandle(handle) {
-    ptr = new _KeyboardServiceProxyCalls(impl);
-  }
+  KeyboardServiceProxy.fromHandle(core.MojoHandle handle)
+      : super(new _KeyboardServiceProxyControl.fromHandle(handle));
 
-  KeyboardServiceProxy.unbound() :
-      impl = new _KeyboardServiceProxyImpl.unbound() {
-    ptr = new _KeyboardServiceProxyCalls(impl);
+  KeyboardServiceProxy.unbound()
+      : super(new _KeyboardServiceProxyControl.unbound());
+
+  static KeyboardServiceProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For KeyboardServiceProxy"));
+    return new KeyboardServiceProxy.fromEndpoint(endpoint);
   }
 
   factory KeyboardServiceProxy.connectToService(
@@ -1904,30 +1815,56 @@
     return p;
   }
 
-  static KeyboardServiceProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For KeyboardServiceProxy"));
-    return new KeyboardServiceProxy.fromEndpoint(endpoint);
+
+  void show(Object client, KeyboardType type) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _KeyboardServiceShowParams();
+    params.client = client;
+    params.type = type;
+    ctrl.sendMessage(params,
+        _keyboardServiceMethodShowName);
   }
-
-  String get serviceName => KeyboardService.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
+  void showByRequest() {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _KeyboardServiceShowByRequestParams();
+    ctrl.sendMessage(params,
+        _keyboardServiceMethodShowByRequestName);
   }
-
-  String toString() {
-    return "KeyboardServiceProxy($impl)";
+  void hide() {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _KeyboardServiceHideParams();
+    ctrl.sendMessage(params,
+        _keyboardServiceMethodHideName);
+  }
+  void setText(String text) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _KeyboardServiceSetTextParams();
+    params.text = text;
+    ctrl.sendMessage(params,
+        _keyboardServiceMethodSetTextName);
+  }
+  void setSelection(int start, int end) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _KeyboardServiceSetSelectionParams();
+    params.start = start;
+    params.end = end;
+    ctrl.sendMessage(params,
+        _keyboardServiceMethodSetSelectionName);
   }
 }
 
@@ -2049,24 +1986,22 @@
 }
 
 
-class _KeyboardServiceFactoryProxyImpl extends bindings.Proxy {
-  _KeyboardServiceFactoryProxyImpl.fromEndpoint(
+class _KeyboardServiceFactoryProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _KeyboardServiceFactoryProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _KeyboardServiceFactoryProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _KeyboardServiceFactoryProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _KeyboardServiceFactoryProxyImpl.unbound() : super.unbound();
-
-  static _KeyboardServiceFactoryProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _KeyboardServiceFactoryProxyImpl"));
-    return new _KeyboardServiceFactoryProxyImpl.fromEndpoint(endpoint);
-  }
+  _KeyboardServiceFactoryProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _KeyboardServiceFactoryServiceDescription();
+      new _KeyboardServiceFactoryServiceDescription();
 
+  String get serviceName => KeyboardServiceFactory.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -2076,52 +2011,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_KeyboardServiceFactoryProxyImpl($superString)";
+    return "_KeyboardServiceFactoryProxyControl($superString)";
   }
 }
 
 
-class _KeyboardServiceFactoryProxyCalls implements KeyboardServiceFactory {
-  _KeyboardServiceFactoryProxyImpl _proxyImpl;
-
-  _KeyboardServiceFactoryProxyCalls(this._proxyImpl);
-    void createKeyboardService(Object keyEventDispatcher, Object serviceRequest) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _KeyboardServiceFactoryCreateKeyboardServiceParams();
-      params.keyEventDispatcher = keyEventDispatcher;
-      params.serviceRequest = serviceRequest;
-      _proxyImpl.sendMessage(params, _keyboardServiceFactoryMethodCreateKeyboardServiceName);
-    }
-}
-
-
-class KeyboardServiceFactoryProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  KeyboardServiceFactory ptr;
-
-  KeyboardServiceFactoryProxy(_KeyboardServiceFactoryProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _KeyboardServiceFactoryProxyCalls(proxyImpl);
-
+class KeyboardServiceFactoryProxy extends bindings.Proxy
+                              implements KeyboardServiceFactory {
   KeyboardServiceFactoryProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _KeyboardServiceFactoryProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _KeyboardServiceFactoryProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _KeyboardServiceFactoryProxyControl.fromEndpoint(endpoint));
 
-  KeyboardServiceFactoryProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _KeyboardServiceFactoryProxyImpl.fromHandle(handle) {
-    ptr = new _KeyboardServiceFactoryProxyCalls(impl);
-  }
+  KeyboardServiceFactoryProxy.fromHandle(core.MojoHandle handle)
+      : super(new _KeyboardServiceFactoryProxyControl.fromHandle(handle));
 
-  KeyboardServiceFactoryProxy.unbound() :
-      impl = new _KeyboardServiceFactoryProxyImpl.unbound() {
-    ptr = new _KeyboardServiceFactoryProxyCalls(impl);
+  KeyboardServiceFactoryProxy.unbound()
+      : super(new _KeyboardServiceFactoryProxyControl.unbound());
+
+  static KeyboardServiceFactoryProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For KeyboardServiceFactoryProxy"));
+    return new KeyboardServiceFactoryProxy.fromEndpoint(endpoint);
   }
 
   factory KeyboardServiceFactoryProxy.connectToService(
@@ -2131,30 +2044,17 @@
     return p;
   }
 
-  static KeyboardServiceFactoryProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For KeyboardServiceFactoryProxy"));
-    return new KeyboardServiceFactoryProxy.fromEndpoint(endpoint);
-  }
 
-  String get serviceName => KeyboardServiceFactory.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "KeyboardServiceFactoryProxy($impl)";
+  void createKeyboardService(Object keyEventDispatcher, Object serviceRequest) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _KeyboardServiceFactoryCreateKeyboardServiceParams();
+    params.keyEventDispatcher = keyEventDispatcher;
+    params.serviceRequest = serviceRequest;
+    ctrl.sendMessage(params,
+        _keyboardServiceFactoryMethodCreateKeyboardServiceName);
   }
 }
 
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 3900521..fc50d4b 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
@@ -255,24 +255,22 @@
 }
 
 
-class _AssetBundleProxyImpl extends bindings.Proxy {
-  _AssetBundleProxyImpl.fromEndpoint(
+class _AssetBundleProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _AssetBundleProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _AssetBundleProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _AssetBundleProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _AssetBundleProxyImpl.unbound() : super.unbound();
-
-  static _AssetBundleProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _AssetBundleProxyImpl"));
-    return new _AssetBundleProxyImpl.fromEndpoint(endpoint);
-  }
+  _AssetBundleProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _AssetBundleServiceDescription();
+      new _AssetBundleServiceDescription();
 
+  String get serviceName => AssetBundle.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _assetBundleMethodGetAsStreamName:
@@ -302,51 +300,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_AssetBundleProxyImpl($superString)";
+    return "_AssetBundleProxyControl($superString)";
   }
 }
 
 
-class _AssetBundleProxyCalls implements AssetBundle {
-  _AssetBundleProxyImpl _proxyImpl;
-
-  _AssetBundleProxyCalls(this._proxyImpl);
-    dynamic getAsStream(String assetName,[Function responseFactory = null]) {
-      var params = new _AssetBundleGetAsStreamParams();
-      params.assetName = assetName;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _assetBundleMethodGetAsStreamName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-}
-
-
-class AssetBundleProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  AssetBundle ptr;
-
-  AssetBundleProxy(_AssetBundleProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _AssetBundleProxyCalls(proxyImpl);
-
+class AssetBundleProxy extends bindings.Proxy
+                              implements AssetBundle {
   AssetBundleProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _AssetBundleProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _AssetBundleProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _AssetBundleProxyControl.fromEndpoint(endpoint));
 
-  AssetBundleProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _AssetBundleProxyImpl.fromHandle(handle) {
-    ptr = new _AssetBundleProxyCalls(impl);
-  }
+  AssetBundleProxy.fromHandle(core.MojoHandle handle)
+      : super(new _AssetBundleProxyControl.fromHandle(handle));
 
-  AssetBundleProxy.unbound() :
-      impl = new _AssetBundleProxyImpl.unbound() {
-    ptr = new _AssetBundleProxyCalls(impl);
+  AssetBundleProxy.unbound()
+      : super(new _AssetBundleProxyControl.unbound());
+
+  static AssetBundleProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For AssetBundleProxy"));
+    return new AssetBundleProxy.fromEndpoint(endpoint);
   }
 
   factory AssetBundleProxy.connectToService(
@@ -356,30 +333,15 @@
     return p;
   }
 
-  static AssetBundleProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For AssetBundleProxy"));
-    return new AssetBundleProxy.fromEndpoint(endpoint);
-  }
 
-  String get serviceName => AssetBundle.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "AssetBundleProxy($impl)";
+  dynamic getAsStream(String assetName,[Function responseFactory = null]) {
+    var params = new _AssetBundleGetAsStreamParams();
+    params.assetName = assetName;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _assetBundleMethodGetAsStreamName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
 }
 
@@ -507,24 +469,22 @@
 }
 
 
-class _AssetUnpackerProxyImpl extends bindings.Proxy {
-  _AssetUnpackerProxyImpl.fromEndpoint(
+class _AssetUnpackerProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _AssetUnpackerProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _AssetUnpackerProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _AssetUnpackerProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _AssetUnpackerProxyImpl.unbound() : super.unbound();
-
-  static _AssetUnpackerProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _AssetUnpackerProxyImpl"));
-    return new _AssetUnpackerProxyImpl.fromEndpoint(endpoint);
-  }
+  _AssetUnpackerProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _AssetUnpackerServiceDescription();
+      new _AssetUnpackerServiceDescription();
 
+  String get serviceName => AssetUnpacker.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -534,52 +494,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_AssetUnpackerProxyImpl($superString)";
+    return "_AssetUnpackerProxyControl($superString)";
   }
 }
 
 
-class _AssetUnpackerProxyCalls implements AssetUnpacker {
-  _AssetUnpackerProxyImpl _proxyImpl;
-
-  _AssetUnpackerProxyCalls(this._proxyImpl);
-    void unpackZipStream(core.MojoDataPipeConsumer zippedAssets, Object assetBundle) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _AssetUnpackerUnpackZipStreamParams();
-      params.zippedAssets = zippedAssets;
-      params.assetBundle = assetBundle;
-      _proxyImpl.sendMessage(params, _assetUnpackerMethodUnpackZipStreamName);
-    }
-}
-
-
-class AssetUnpackerProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  AssetUnpacker ptr;
-
-  AssetUnpackerProxy(_AssetUnpackerProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _AssetUnpackerProxyCalls(proxyImpl);
-
+class AssetUnpackerProxy extends bindings.Proxy
+                              implements AssetUnpacker {
   AssetUnpackerProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _AssetUnpackerProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _AssetUnpackerProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _AssetUnpackerProxyControl.fromEndpoint(endpoint));
 
-  AssetUnpackerProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _AssetUnpackerProxyImpl.fromHandle(handle) {
-    ptr = new _AssetUnpackerProxyCalls(impl);
-  }
+  AssetUnpackerProxy.fromHandle(core.MojoHandle handle)
+      : super(new _AssetUnpackerProxyControl.fromHandle(handle));
 
-  AssetUnpackerProxy.unbound() :
-      impl = new _AssetUnpackerProxyImpl.unbound() {
-    ptr = new _AssetUnpackerProxyCalls(impl);
+  AssetUnpackerProxy.unbound()
+      : super(new _AssetUnpackerProxyControl.unbound());
+
+  static AssetUnpackerProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For AssetUnpackerProxy"));
+    return new AssetUnpackerProxy.fromEndpoint(endpoint);
   }
 
   factory AssetUnpackerProxy.connectToService(
@@ -589,30 +527,17 @@
     return p;
   }
 
-  static AssetUnpackerProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For AssetUnpackerProxy"));
-    return new AssetUnpackerProxy.fromEndpoint(endpoint);
-  }
 
-  String get serviceName => AssetUnpacker.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "AssetUnpackerProxy($impl)";
+  void unpackZipStream(core.MojoDataPipeConsumer zippedAssets, Object assetBundle) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _AssetUnpackerUnpackZipStreamParams();
+    params.zippedAssets = zippedAssets;
+    params.assetBundle = assetBundle;
+    ctrl.sendMessage(params,
+        _assetUnpackerMethodUnpackZipStreamName);
   }
 }
 
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 538e4b3..1e3d91c 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
@@ -114,24 +114,22 @@
 }
 
 
-class _AuthenticatingUrlLoaderInterceptorMetaFactoryProxyImpl extends bindings.Proxy {
-  _AuthenticatingUrlLoaderInterceptorMetaFactoryProxyImpl.fromEndpoint(
+class _AuthenticatingUrlLoaderInterceptorMetaFactoryProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _AuthenticatingUrlLoaderInterceptorMetaFactoryProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _AuthenticatingUrlLoaderInterceptorMetaFactoryProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _AuthenticatingUrlLoaderInterceptorMetaFactoryProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _AuthenticatingUrlLoaderInterceptorMetaFactoryProxyImpl.unbound() : super.unbound();
-
-  static _AuthenticatingUrlLoaderInterceptorMetaFactoryProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _AuthenticatingUrlLoaderInterceptorMetaFactoryProxyImpl"));
-    return new _AuthenticatingUrlLoaderInterceptorMetaFactoryProxyImpl.fromEndpoint(endpoint);
-  }
+  _AuthenticatingUrlLoaderInterceptorMetaFactoryProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _AuthenticatingUrlLoaderInterceptorMetaFactoryServiceDescription();
+      new _AuthenticatingUrlLoaderInterceptorMetaFactoryServiceDescription();
 
+  String get serviceName => AuthenticatingUrlLoaderInterceptorMetaFactory.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -141,52 +139,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_AuthenticatingUrlLoaderInterceptorMetaFactoryProxyImpl($superString)";
+    return "_AuthenticatingUrlLoaderInterceptorMetaFactoryProxyControl($superString)";
   }
 }
 
 
-class _AuthenticatingUrlLoaderInterceptorMetaFactoryProxyCalls implements AuthenticatingUrlLoaderInterceptorMetaFactory {
-  _AuthenticatingUrlLoaderInterceptorMetaFactoryProxyImpl _proxyImpl;
-
-  _AuthenticatingUrlLoaderInterceptorMetaFactoryProxyCalls(this._proxyImpl);
-    void createUrlLoaderInterceptorFactory(Object factoryRequest, Object authenticationService) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _AuthenticatingUrlLoaderInterceptorMetaFactoryCreateUrlLoaderInterceptorFactoryParams();
-      params.factoryRequest = factoryRequest;
-      params.authenticationService = authenticationService;
-      _proxyImpl.sendMessage(params, _authenticatingUrlLoaderInterceptorMetaFactoryMethodCreateUrlLoaderInterceptorFactoryName);
-    }
-}
-
-
-class AuthenticatingUrlLoaderInterceptorMetaFactoryProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  AuthenticatingUrlLoaderInterceptorMetaFactory ptr;
-
-  AuthenticatingUrlLoaderInterceptorMetaFactoryProxy(_AuthenticatingUrlLoaderInterceptorMetaFactoryProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _AuthenticatingUrlLoaderInterceptorMetaFactoryProxyCalls(proxyImpl);
-
+class AuthenticatingUrlLoaderInterceptorMetaFactoryProxy extends bindings.Proxy
+                              implements AuthenticatingUrlLoaderInterceptorMetaFactory {
   AuthenticatingUrlLoaderInterceptorMetaFactoryProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _AuthenticatingUrlLoaderInterceptorMetaFactoryProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _AuthenticatingUrlLoaderInterceptorMetaFactoryProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _AuthenticatingUrlLoaderInterceptorMetaFactoryProxyControl.fromEndpoint(endpoint));
 
-  AuthenticatingUrlLoaderInterceptorMetaFactoryProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _AuthenticatingUrlLoaderInterceptorMetaFactoryProxyImpl.fromHandle(handle) {
-    ptr = new _AuthenticatingUrlLoaderInterceptorMetaFactoryProxyCalls(impl);
-  }
+  AuthenticatingUrlLoaderInterceptorMetaFactoryProxy.fromHandle(core.MojoHandle handle)
+      : super(new _AuthenticatingUrlLoaderInterceptorMetaFactoryProxyControl.fromHandle(handle));
 
-  AuthenticatingUrlLoaderInterceptorMetaFactoryProxy.unbound() :
-      impl = new _AuthenticatingUrlLoaderInterceptorMetaFactoryProxyImpl.unbound() {
-    ptr = new _AuthenticatingUrlLoaderInterceptorMetaFactoryProxyCalls(impl);
+  AuthenticatingUrlLoaderInterceptorMetaFactoryProxy.unbound()
+      : super(new _AuthenticatingUrlLoaderInterceptorMetaFactoryProxyControl.unbound());
+
+  static AuthenticatingUrlLoaderInterceptorMetaFactoryProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For AuthenticatingUrlLoaderInterceptorMetaFactoryProxy"));
+    return new AuthenticatingUrlLoaderInterceptorMetaFactoryProxy.fromEndpoint(endpoint);
   }
 
   factory AuthenticatingUrlLoaderInterceptorMetaFactoryProxy.connectToService(
@@ -196,30 +172,17 @@
     return p;
   }
 
-  static AuthenticatingUrlLoaderInterceptorMetaFactoryProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For AuthenticatingUrlLoaderInterceptorMetaFactoryProxy"));
-    return new AuthenticatingUrlLoaderInterceptorMetaFactoryProxy.fromEndpoint(endpoint);
-  }
 
-  String get serviceName => AuthenticatingUrlLoaderInterceptorMetaFactory.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "AuthenticatingUrlLoaderInterceptorMetaFactoryProxy($impl)";
+  void createUrlLoaderInterceptorFactory(Object factoryRequest, Object authenticationService) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _AuthenticatingUrlLoaderInterceptorMetaFactoryCreateUrlLoaderInterceptorFactoryParams();
+    params.factoryRequest = factoryRequest;
+    params.authenticationService = authenticationService;
+    ctrl.sendMessage(params,
+        _authenticatingUrlLoaderInterceptorMetaFactoryMethodCreateUrlLoaderInterceptorFactoryName);
   }
 }
 
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 0609443..a422cbc 100644
--- a/mojo/dart/packages/mojo_services/lib/mojo/camera.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/mojo/camera.mojom.dart
@@ -577,24 +577,22 @@
 }
 
 
-class _CameraRollServiceProxyImpl extends bindings.Proxy {
-  _CameraRollServiceProxyImpl.fromEndpoint(
+class _CameraRollServiceProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _CameraRollServiceProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _CameraRollServiceProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _CameraRollServiceProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _CameraRollServiceProxyImpl.unbound() : super.unbound();
-
-  static _CameraRollServiceProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _CameraRollServiceProxyImpl"));
-    return new _CameraRollServiceProxyImpl.fromEndpoint(endpoint);
-  }
+  _CameraRollServiceProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _CameraRollServiceServiceDescription();
+      new _CameraRollServiceServiceDescription();
 
+  String get serviceName => CameraRollService.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _cameraRollServiceMethodGetCountName:
@@ -644,67 +642,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_CameraRollServiceProxyImpl($superString)";
+    return "_CameraRollServiceProxyControl($superString)";
   }
 }
 
 
-class _CameraRollServiceProxyCalls implements CameraRollService {
-  _CameraRollServiceProxyImpl _proxyImpl;
-
-  _CameraRollServiceProxyCalls(this._proxyImpl);
-    void update() {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _CameraRollServiceUpdateParams();
-      _proxyImpl.sendMessage(params, _cameraRollServiceMethodUpdateName);
-    }
-    dynamic getCount([Function responseFactory = null]) {
-      var params = new _CameraRollServiceGetCountParams();
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _cameraRollServiceMethodGetCountName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    dynamic getPhoto(int index,[Function responseFactory = null]) {
-      var params = new _CameraRollServiceGetPhotoParams();
-      params.index = index;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _cameraRollServiceMethodGetPhotoName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-}
-
-
-class CameraRollServiceProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  CameraRollService ptr;
-
-  CameraRollServiceProxy(_CameraRollServiceProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _CameraRollServiceProxyCalls(proxyImpl);
-
+class CameraRollServiceProxy extends bindings.Proxy
+                              implements CameraRollService {
   CameraRollServiceProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _CameraRollServiceProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _CameraRollServiceProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _CameraRollServiceProxyControl.fromEndpoint(endpoint));
 
-  CameraRollServiceProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _CameraRollServiceProxyImpl.fromHandle(handle) {
-    ptr = new _CameraRollServiceProxyCalls(impl);
-  }
+  CameraRollServiceProxy.fromHandle(core.MojoHandle handle)
+      : super(new _CameraRollServiceProxyControl.fromHandle(handle));
 
-  CameraRollServiceProxy.unbound() :
-      impl = new _CameraRollServiceProxyImpl.unbound() {
-    ptr = new _CameraRollServiceProxyCalls(impl);
+  CameraRollServiceProxy.unbound()
+      : super(new _CameraRollServiceProxyControl.unbound());
+
+  static CameraRollServiceProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For CameraRollServiceProxy"));
+    return new CameraRollServiceProxy.fromEndpoint(endpoint);
   }
 
   factory CameraRollServiceProxy.connectToService(
@@ -714,30 +675,32 @@
     return p;
   }
 
-  static CameraRollServiceProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For CameraRollServiceProxy"));
-    return new CameraRollServiceProxy.fromEndpoint(endpoint);
+
+  void update() {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _CameraRollServiceUpdateParams();
+    ctrl.sendMessage(params,
+        _cameraRollServiceMethodUpdateName);
   }
-
-  String get serviceName => CameraRollService.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
+  dynamic getCount([Function responseFactory = null]) {
+    var params = new _CameraRollServiceGetCountParams();
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _cameraRollServiceMethodGetCountName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
-
-  String toString() {
-    return "CameraRollServiceProxy($impl)";
+  dynamic getPhoto(int index,[Function responseFactory = null]) {
+    var params = new _CameraRollServiceGetPhotoParams();
+    params.index = index;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _cameraRollServiceMethodGetPhotoName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
 }
 
@@ -893,24 +856,22 @@
 }
 
 
-class _CameraServiceProxyImpl extends bindings.Proxy {
-  _CameraServiceProxyImpl.fromEndpoint(
+class _CameraServiceProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _CameraServiceProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _CameraServiceProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _CameraServiceProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _CameraServiceProxyImpl.unbound() : super.unbound();
-
-  static _CameraServiceProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _CameraServiceProxyImpl"));
-    return new _CameraServiceProxyImpl.fromEndpoint(endpoint);
-  }
+  _CameraServiceProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _CameraServiceServiceDescription();
+      new _CameraServiceServiceDescription();
 
+  String get serviceName => CameraService.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _cameraServiceMethodGetLatestFrameName:
@@ -940,50 +901,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_CameraServiceProxyImpl($superString)";
+    return "_CameraServiceProxyControl($superString)";
   }
 }
 
 
-class _CameraServiceProxyCalls implements CameraService {
-  _CameraServiceProxyImpl _proxyImpl;
-
-  _CameraServiceProxyCalls(this._proxyImpl);
-    dynamic getLatestFrame([Function responseFactory = null]) {
-      var params = new _CameraServiceGetLatestFrameParams();
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _cameraServiceMethodGetLatestFrameName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-}
-
-
-class CameraServiceProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  CameraService ptr;
-
-  CameraServiceProxy(_CameraServiceProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _CameraServiceProxyCalls(proxyImpl);
-
+class CameraServiceProxy extends bindings.Proxy
+                              implements CameraService {
   CameraServiceProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _CameraServiceProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _CameraServiceProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _CameraServiceProxyControl.fromEndpoint(endpoint));
 
-  CameraServiceProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _CameraServiceProxyImpl.fromHandle(handle) {
-    ptr = new _CameraServiceProxyCalls(impl);
-  }
+  CameraServiceProxy.fromHandle(core.MojoHandle handle)
+      : super(new _CameraServiceProxyControl.fromHandle(handle));
 
-  CameraServiceProxy.unbound() :
-      impl = new _CameraServiceProxyImpl.unbound() {
-    ptr = new _CameraServiceProxyCalls(impl);
+  CameraServiceProxy.unbound()
+      : super(new _CameraServiceProxyControl.unbound());
+
+  static CameraServiceProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For CameraServiceProxy"));
+    return new CameraServiceProxy.fromEndpoint(endpoint);
   }
 
   factory CameraServiceProxy.connectToService(
@@ -993,30 +934,14 @@
     return p;
   }
 
-  static CameraServiceProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For CameraServiceProxy"));
-    return new CameraServiceProxy.fromEndpoint(endpoint);
-  }
 
-  String get serviceName => CameraService.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "CameraServiceProxy($impl)";
+  dynamic getLatestFrame([Function responseFactory = null]) {
+    var params = new _CameraServiceGetLatestFrameParams();
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _cameraServiceMethodGetLatestFrameName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
 }
 
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 033bb96..6630ee0 100644
--- a/mojo/dart/packages/mojo_services/lib/mojo/clipboard.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/mojo/clipboard.mojom.dart
@@ -712,24 +712,22 @@
 }
 
 
-class _ClipboardProxyImpl extends bindings.Proxy {
-  _ClipboardProxyImpl.fromEndpoint(
+class _ClipboardProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _ClipboardProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _ClipboardProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _ClipboardProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _ClipboardProxyImpl.unbound() : super.unbound();
-
-  static _ClipboardProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _ClipboardProxyImpl"));
-    return new _ClipboardProxyImpl.fromEndpoint(endpoint);
-  }
+  _ClipboardProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _ClipboardServiceDescription();
+      new _ClipboardServiceDescription();
 
+  String get serviceName => Clipboard.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _clipboardMethodGetSequenceNumberName:
@@ -799,80 +797,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_ClipboardProxyImpl($superString)";
+    return "_ClipboardProxyControl($superString)";
   }
 }
 
 
-class _ClipboardProxyCalls implements Clipboard {
-  _ClipboardProxyImpl _proxyImpl;
-
-  _ClipboardProxyCalls(this._proxyImpl);
-    dynamic getSequenceNumber(ClipboardType clipboardType,[Function responseFactory = null]) {
-      var params = new _ClipboardGetSequenceNumberParams();
-      params.clipboardType = clipboardType;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _clipboardMethodGetSequenceNumberName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    dynamic getAvailableMimeTypes(ClipboardType clipboardTypes,[Function responseFactory = null]) {
-      var params = new _ClipboardGetAvailableMimeTypesParams();
-      params.clipboardTypes = clipboardTypes;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _clipboardMethodGetAvailableMimeTypesName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    dynamic readMimeType(ClipboardType clipboardType,String mimeType,[Function responseFactory = null]) {
-      var params = new _ClipboardReadMimeTypeParams();
-      params.clipboardType = clipboardType;
-      params.mimeType = mimeType;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _clipboardMethodReadMimeTypeName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    void writeClipboardData(ClipboardType clipboardType, Map<String, List<int>> data) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _ClipboardWriteClipboardDataParams();
-      params.clipboardType = clipboardType;
-      params.data = data;
-      _proxyImpl.sendMessage(params, _clipboardMethodWriteClipboardDataName);
-    }
-}
-
-
-class ClipboardProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  Clipboard ptr;
-
-  ClipboardProxy(_ClipboardProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _ClipboardProxyCalls(proxyImpl);
-
+class ClipboardProxy extends bindings.Proxy
+                              implements Clipboard {
   ClipboardProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _ClipboardProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _ClipboardProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _ClipboardProxyControl.fromEndpoint(endpoint));
 
-  ClipboardProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _ClipboardProxyImpl.fromHandle(handle) {
-    ptr = new _ClipboardProxyCalls(impl);
-  }
+  ClipboardProxy.fromHandle(core.MojoHandle handle)
+      : super(new _ClipboardProxyControl.fromHandle(handle));
 
-  ClipboardProxy.unbound() :
-      impl = new _ClipboardProxyImpl.unbound() {
-    ptr = new _ClipboardProxyCalls(impl);
+  ClipboardProxy.unbound()
+      : super(new _ClipboardProxyControl.unbound());
+
+  static ClipboardProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ClipboardProxy"));
+    return new ClipboardProxy.fromEndpoint(endpoint);
   }
 
   factory ClipboardProxy.connectToService(
@@ -882,30 +830,45 @@
     return p;
   }
 
-  static ClipboardProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For ClipboardProxy"));
-    return new ClipboardProxy.fromEndpoint(endpoint);
+
+  dynamic getSequenceNumber(ClipboardType clipboardType,[Function responseFactory = null]) {
+    var params = new _ClipboardGetSequenceNumberParams();
+    params.clipboardType = clipboardType;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _clipboardMethodGetSequenceNumberName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
-
-  String get serviceName => Clipboard.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
+  dynamic getAvailableMimeTypes(ClipboardType clipboardTypes,[Function responseFactory = null]) {
+    var params = new _ClipboardGetAvailableMimeTypesParams();
+    params.clipboardTypes = clipboardTypes;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _clipboardMethodGetAvailableMimeTypesName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
-
-  String toString() {
-    return "ClipboardProxy($impl)";
+  dynamic readMimeType(ClipboardType clipboardType,String mimeType,[Function responseFactory = null]) {
+    var params = new _ClipboardReadMimeTypeParams();
+    params.clipboardType = clipboardType;
+    params.mimeType = mimeType;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _clipboardMethodReadMimeTypeName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
+  }
+  void writeClipboardData(ClipboardType clipboardType, Map<String, List<int>> data) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _ClipboardWriteClipboardDataParams();
+    params.clipboardType = clipboardType;
+    params.data = data;
+    ctrl.sendMessage(params,
+        _clipboardMethodWriteClipboardDataName);
   }
 }
 
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 217e3d7..948da4f 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
@@ -115,24 +115,22 @@
 }
 
 
-class _ContentHandlerProxyImpl extends bindings.Proxy {
-  _ContentHandlerProxyImpl.fromEndpoint(
+class _ContentHandlerProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _ContentHandlerProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _ContentHandlerProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _ContentHandlerProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _ContentHandlerProxyImpl.unbound() : super.unbound();
-
-  static _ContentHandlerProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _ContentHandlerProxyImpl"));
-    return new _ContentHandlerProxyImpl.fromEndpoint(endpoint);
-  }
+  _ContentHandlerProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _ContentHandlerServiceDescription();
+      new _ContentHandlerServiceDescription();
 
+  String get serviceName => ContentHandler.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -142,52 +140,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_ContentHandlerProxyImpl($superString)";
+    return "_ContentHandlerProxyControl($superString)";
   }
 }
 
 
-class _ContentHandlerProxyCalls implements ContentHandler {
-  _ContentHandlerProxyImpl _proxyImpl;
-
-  _ContentHandlerProxyCalls(this._proxyImpl);
-    void startApplication(Object application, url_response_mojom.UrlResponse response) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _ContentHandlerStartApplicationParams();
-      params.application = application;
-      params.response = response;
-      _proxyImpl.sendMessage(params, _contentHandlerMethodStartApplicationName);
-    }
-}
-
-
-class ContentHandlerProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  ContentHandler ptr;
-
-  ContentHandlerProxy(_ContentHandlerProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _ContentHandlerProxyCalls(proxyImpl);
-
+class ContentHandlerProxy extends bindings.Proxy
+                              implements ContentHandler {
   ContentHandlerProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _ContentHandlerProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _ContentHandlerProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _ContentHandlerProxyControl.fromEndpoint(endpoint));
 
-  ContentHandlerProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _ContentHandlerProxyImpl.fromHandle(handle) {
-    ptr = new _ContentHandlerProxyCalls(impl);
-  }
+  ContentHandlerProxy.fromHandle(core.MojoHandle handle)
+      : super(new _ContentHandlerProxyControl.fromHandle(handle));
 
-  ContentHandlerProxy.unbound() :
-      impl = new _ContentHandlerProxyImpl.unbound() {
-    ptr = new _ContentHandlerProxyCalls(impl);
+  ContentHandlerProxy.unbound()
+      : super(new _ContentHandlerProxyControl.unbound());
+
+  static ContentHandlerProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ContentHandlerProxy"));
+    return new ContentHandlerProxy.fromEndpoint(endpoint);
   }
 
   factory ContentHandlerProxy.connectToService(
@@ -197,30 +173,17 @@
     return p;
   }
 
-  static ContentHandlerProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For ContentHandlerProxy"));
-    return new ContentHandlerProxy.fromEndpoint(endpoint);
-  }
 
-  String get serviceName => ContentHandler.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "ContentHandlerProxy($impl)";
+  void startApplication(Object application, url_response_mojom.UrlResponse response) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _ContentHandlerStartApplicationParams();
+    params.application = application;
+    params.response = response;
+    ctrl.sendMessage(params,
+        _contentHandlerMethodStartApplicationName);
   }
 }
 
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 ab2c6c2..9aa64ce 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
@@ -332,24 +332,22 @@
 }
 
 
-class _CookieStoreProxyImpl extends bindings.Proxy {
-  _CookieStoreProxyImpl.fromEndpoint(
+class _CookieStoreProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _CookieStoreProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _CookieStoreProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _CookieStoreProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _CookieStoreProxyImpl.unbound() : super.unbound();
-
-  static _CookieStoreProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _CookieStoreProxyImpl"));
-    return new _CookieStoreProxyImpl.fromEndpoint(endpoint);
-  }
+  _CookieStoreProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _CookieStoreServiceDescription();
+      new _CookieStoreServiceDescription();
 
+  String get serviceName => CookieStore.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _cookieStoreMethodGetName:
@@ -399,61 +397,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_CookieStoreProxyImpl($superString)";
+    return "_CookieStoreProxyControl($superString)";
   }
 }
 
 
-class _CookieStoreProxyCalls implements CookieStore {
-  _CookieStoreProxyImpl _proxyImpl;
-
-  _CookieStoreProxyCalls(this._proxyImpl);
-    dynamic get(String url,[Function responseFactory = null]) {
-      var params = new _CookieStoreGetParams();
-      params.url = url;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _cookieStoreMethodGetName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    dynamic set(String url,String cookie,[Function responseFactory = null]) {
-      var params = new _CookieStoreSetParams();
-      params.url = url;
-      params.cookie = cookie;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _cookieStoreMethodSetName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-}
-
-
-class CookieStoreProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  CookieStore ptr;
-
-  CookieStoreProxy(_CookieStoreProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _CookieStoreProxyCalls(proxyImpl);
-
+class CookieStoreProxy extends bindings.Proxy
+                              implements CookieStore {
   CookieStoreProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _CookieStoreProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _CookieStoreProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _CookieStoreProxyControl.fromEndpoint(endpoint));
 
-  CookieStoreProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _CookieStoreProxyImpl.fromHandle(handle) {
-    ptr = new _CookieStoreProxyCalls(impl);
-  }
+  CookieStoreProxy.fromHandle(core.MojoHandle handle)
+      : super(new _CookieStoreProxyControl.fromHandle(handle));
 
-  CookieStoreProxy.unbound() :
-      impl = new _CookieStoreProxyImpl.unbound() {
-    ptr = new _CookieStoreProxyCalls(impl);
+  CookieStoreProxy.unbound()
+      : super(new _CookieStoreProxyControl.unbound());
+
+  static CookieStoreProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For CookieStoreProxy"));
+    return new CookieStoreProxy.fromEndpoint(endpoint);
   }
 
   factory CookieStoreProxy.connectToService(
@@ -463,30 +430,25 @@
     return p;
   }
 
-  static CookieStoreProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For CookieStoreProxy"));
-    return new CookieStoreProxy.fromEndpoint(endpoint);
+
+  dynamic get(String url,[Function responseFactory = null]) {
+    var params = new _CookieStoreGetParams();
+    params.url = url;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _cookieStoreMethodGetName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
-
-  String get serviceName => CookieStore.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "CookieStoreProxy($impl)";
+  dynamic set(String url,String cookie,[Function responseFactory = null]) {
+    var params = new _CookieStoreSetParams();
+    params.url = url;
+    params.cookie = cookie;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _cookieStoreMethodSetName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
 }
 
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 868a58c..9a4069c 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
@@ -249,24 +249,22 @@
 }
 
 
-class _DeviceInfoProxyImpl extends bindings.Proxy {
-  _DeviceInfoProxyImpl.fromEndpoint(
+class _DeviceInfoProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _DeviceInfoProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _DeviceInfoProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _DeviceInfoProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _DeviceInfoProxyImpl.unbound() : super.unbound();
-
-  static _DeviceInfoProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _DeviceInfoProxyImpl"));
-    return new _DeviceInfoProxyImpl.fromEndpoint(endpoint);
-  }
+  _DeviceInfoProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _DeviceInfoServiceDescription();
+      new _DeviceInfoServiceDescription();
 
+  String get serviceName => DeviceInfo.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _deviceInfoMethodGetDeviceTypeName:
@@ -296,50 +294,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_DeviceInfoProxyImpl($superString)";
+    return "_DeviceInfoProxyControl($superString)";
   }
 }
 
 
-class _DeviceInfoProxyCalls implements DeviceInfo {
-  _DeviceInfoProxyImpl _proxyImpl;
-
-  _DeviceInfoProxyCalls(this._proxyImpl);
-    dynamic getDeviceType([Function responseFactory = null]) {
-      var params = new _DeviceInfoGetDeviceTypeParams();
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _deviceInfoMethodGetDeviceTypeName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-}
-
-
-class DeviceInfoProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  DeviceInfo ptr;
-
-  DeviceInfoProxy(_DeviceInfoProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _DeviceInfoProxyCalls(proxyImpl);
-
+class DeviceInfoProxy extends bindings.Proxy
+                              implements DeviceInfo {
   DeviceInfoProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _DeviceInfoProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _DeviceInfoProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _DeviceInfoProxyControl.fromEndpoint(endpoint));
 
-  DeviceInfoProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _DeviceInfoProxyImpl.fromHandle(handle) {
-    ptr = new _DeviceInfoProxyCalls(impl);
-  }
+  DeviceInfoProxy.fromHandle(core.MojoHandle handle)
+      : super(new _DeviceInfoProxyControl.fromHandle(handle));
 
-  DeviceInfoProxy.unbound() :
-      impl = new _DeviceInfoProxyImpl.unbound() {
-    ptr = new _DeviceInfoProxyCalls(impl);
+  DeviceInfoProxy.unbound()
+      : super(new _DeviceInfoProxyControl.unbound());
+
+  static DeviceInfoProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For DeviceInfoProxy"));
+    return new DeviceInfoProxy.fromEndpoint(endpoint);
   }
 
   factory DeviceInfoProxy.connectToService(
@@ -349,30 +327,14 @@
     return p;
   }
 
-  static DeviceInfoProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For DeviceInfoProxy"));
-    return new DeviceInfoProxy.fromEndpoint(endpoint);
-  }
 
-  String get serviceName => DeviceInfo.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "DeviceInfoProxy($impl)";
+  dynamic getDeviceType([Function responseFactory = null]) {
+    var params = new _DeviceInfoGetDeviceTypeParams();
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _deviceInfoMethodGetDeviceTypeName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
 }
 
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 4e58eaa..5201126 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
@@ -1191,24 +1191,22 @@
 }
 
 
-class _DirectoryProxyImpl extends bindings.Proxy {
-  _DirectoryProxyImpl.fromEndpoint(
+class _DirectoryProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _DirectoryProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _DirectoryProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _DirectoryProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _DirectoryProxyImpl.unbound() : super.unbound();
-
-  static _DirectoryProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _DirectoryProxyImpl"));
-    return new _DirectoryProxyImpl.fromEndpoint(endpoint);
-  }
+  _DirectoryProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _DirectoryServiceDescription();
+      new _DirectoryServiceDescription();
 
+  String get serviceName => Directory.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _directoryMethodReadName:
@@ -1358,110 +1356,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_DirectoryProxyImpl($superString)";
+    return "_DirectoryProxyControl($superString)";
   }
 }
 
 
-class _DirectoryProxyCalls implements Directory {
-  _DirectoryProxyImpl _proxyImpl;
-
-  _DirectoryProxyCalls(this._proxyImpl);
-    dynamic read([Function responseFactory = null]) {
-      var params = new _DirectoryReadParams();
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _directoryMethodReadName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    dynamic stat([Function responseFactory = null]) {
-      var params = new _DirectoryStatParams();
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _directoryMethodStatName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    dynamic touch(types_mojom.TimespecOrNow atime,types_mojom.TimespecOrNow mtime,[Function responseFactory = null]) {
-      var params = new _DirectoryTouchParams();
-      params.atime = atime;
-      params.mtime = mtime;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _directoryMethodTouchName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    dynamic openFile(String path,Object file,int openFlags,[Function responseFactory = null]) {
-      var params = new _DirectoryOpenFileParams();
-      params.path = path;
-      params.file = file;
-      params.openFlags = openFlags;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _directoryMethodOpenFileName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    dynamic openDirectory(String path,Object directory,int openFlags,[Function responseFactory = null]) {
-      var params = new _DirectoryOpenDirectoryParams();
-      params.path = path;
-      params.directory = directory;
-      params.openFlags = openFlags;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _directoryMethodOpenDirectoryName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    dynamic rename(String path,String newPath,[Function responseFactory = null]) {
-      var params = new _DirectoryRenameParams();
-      params.path = path;
-      params.newPath = newPath;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _directoryMethodRenameName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    dynamic delete(String path,int deleteFlags,[Function responseFactory = null]) {
-      var params = new _DirectoryDeleteParams();
-      params.path = path;
-      params.deleteFlags = deleteFlags;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _directoryMethodDeleteName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-}
-
-
-class DirectoryProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  Directory ptr;
-
-  DirectoryProxy(_DirectoryProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _DirectoryProxyCalls(proxyImpl);
-
+class DirectoryProxy extends bindings.Proxy
+                              implements Directory {
   DirectoryProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _DirectoryProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _DirectoryProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _DirectoryProxyControl.fromEndpoint(endpoint));
 
-  DirectoryProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _DirectoryProxyImpl.fromHandle(handle) {
-    ptr = new _DirectoryProxyCalls(impl);
-  }
+  DirectoryProxy.fromHandle(core.MojoHandle handle)
+      : super(new _DirectoryProxyControl.fromHandle(handle));
 
-  DirectoryProxy.unbound() :
-      impl = new _DirectoryProxyImpl.unbound() {
-    ptr = new _DirectoryProxyCalls(impl);
+  DirectoryProxy.unbound()
+      : super(new _DirectoryProxyControl.unbound());
+
+  static DirectoryProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For DirectoryProxy"));
+    return new DirectoryProxy.fromEndpoint(endpoint);
   }
 
   factory DirectoryProxy.connectToService(
@@ -1471,30 +1389,74 @@
     return p;
   }
 
-  static DirectoryProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For DirectoryProxy"));
-    return new DirectoryProxy.fromEndpoint(endpoint);
+
+  dynamic read([Function responseFactory = null]) {
+    var params = new _DirectoryReadParams();
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _directoryMethodReadName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
-
-  String get serviceName => Directory.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
+  dynamic stat([Function responseFactory = null]) {
+    var params = new _DirectoryStatParams();
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _directoryMethodStatName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
-
-  String toString() {
-    return "DirectoryProxy($impl)";
+  dynamic touch(types_mojom.TimespecOrNow atime,types_mojom.TimespecOrNow mtime,[Function responseFactory = null]) {
+    var params = new _DirectoryTouchParams();
+    params.atime = atime;
+    params.mtime = mtime;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _directoryMethodTouchName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
+  }
+  dynamic openFile(String path,Object file,int openFlags,[Function responseFactory = null]) {
+    var params = new _DirectoryOpenFileParams();
+    params.path = path;
+    params.file = file;
+    params.openFlags = openFlags;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _directoryMethodOpenFileName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
+  }
+  dynamic openDirectory(String path,Object directory,int openFlags,[Function responseFactory = null]) {
+    var params = new _DirectoryOpenDirectoryParams();
+    params.path = path;
+    params.directory = directory;
+    params.openFlags = openFlags;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _directoryMethodOpenDirectoryName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
+  }
+  dynamic rename(String path,String newPath,[Function responseFactory = null]) {
+    var params = new _DirectoryRenameParams();
+    params.path = path;
+    params.newPath = newPath;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _directoryMethodRenameName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
+  }
+  dynamic delete(String path,int deleteFlags,[Function responseFactory = null]) {
+    var params = new _DirectoryDeleteParams();
+    params.path = path;
+    params.deleteFlags = deleteFlags;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _directoryMethodDeleteName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
 }
 
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 aaf5bce..90dcf99 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
@@ -2345,7 +2345,7 @@
 
 abstract class File {
   static const String serviceName = null;
-  dynamic close([Function responseFactory = null]);
+  dynamic close_([Function responseFactory = null]);
   dynamic read(int numBytesToRead,int offset,types_mojom.Whence whence,[Function responseFactory = null]);
   dynamic write(List<int> bytesToWrite,int offset,types_mojom.Whence whence,[Function responseFactory = null]);
   dynamic readToStream(core.MojoDataPipeProducer source,int offset,types_mojom.Whence whence,int numBytesToRead,[Function responseFactory = null]);
@@ -2362,24 +2362,22 @@
 }
 
 
-class _FileProxyImpl extends bindings.Proxy {
-  _FileProxyImpl.fromEndpoint(
+class _FileProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _FileProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _FileProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _FileProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _FileProxyImpl.unbound() : super.unbound();
-
-  static _FileProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _FileProxyImpl"));
-    return new _FileProxyImpl.fromEndpoint(endpoint);
-  }
+  _FileProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _FileServiceDescription();
+      new _FileServiceDescription();
 
+  String get serviceName => File.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _fileMethodCloseName:
@@ -2669,177 +2667,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_FileProxyImpl($superString)";
+    return "_FileProxyControl($superString)";
   }
 }
 
 
-class _FileProxyCalls implements File {
-  _FileProxyImpl _proxyImpl;
-
-  _FileProxyCalls(this._proxyImpl);
-    dynamic close([Function responseFactory = null]) {
-      var params = new _FileCloseParams();
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _fileMethodCloseName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    dynamic read(int numBytesToRead,int offset,types_mojom.Whence whence,[Function responseFactory = null]) {
-      var params = new _FileReadParams();
-      params.numBytesToRead = numBytesToRead;
-      params.offset = offset;
-      params.whence = whence;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _fileMethodReadName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    dynamic write(List<int> bytesToWrite,int offset,types_mojom.Whence whence,[Function responseFactory = null]) {
-      var params = new _FileWriteParams();
-      params.bytesToWrite = bytesToWrite;
-      params.offset = offset;
-      params.whence = whence;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _fileMethodWriteName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    dynamic readToStream(core.MojoDataPipeProducer source,int offset,types_mojom.Whence whence,int numBytesToRead,[Function responseFactory = null]) {
-      var params = new _FileReadToStreamParams();
-      params.source = source;
-      params.offset = offset;
-      params.whence = whence;
-      params.numBytesToRead = numBytesToRead;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _fileMethodReadToStreamName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    dynamic writeFromStream(core.MojoDataPipeConsumer sink,int offset,types_mojom.Whence whence,[Function responseFactory = null]) {
-      var params = new _FileWriteFromStreamParams();
-      params.sink = sink;
-      params.offset = offset;
-      params.whence = whence;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _fileMethodWriteFromStreamName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    dynamic tell([Function responseFactory = null]) {
-      var params = new _FileTellParams();
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _fileMethodTellName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    dynamic seek(int offset,types_mojom.Whence whence,[Function responseFactory = null]) {
-      var params = new _FileSeekParams();
-      params.offset = offset;
-      params.whence = whence;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _fileMethodSeekName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    dynamic stat([Function responseFactory = null]) {
-      var params = new _FileStatParams();
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _fileMethodStatName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    dynamic truncate(int size,[Function responseFactory = null]) {
-      var params = new _FileTruncateParams();
-      params.size = size;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _fileMethodTruncateName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    dynamic touch(types_mojom.TimespecOrNow atime,types_mojom.TimespecOrNow mtime,[Function responseFactory = null]) {
-      var params = new _FileTouchParams();
-      params.atime = atime;
-      params.mtime = mtime;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _fileMethodTouchName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    dynamic dup(Object file,[Function responseFactory = null]) {
-      var params = new _FileDupParams();
-      params.file = file;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _fileMethodDupName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    dynamic reopen(Object file,int openFlags,[Function responseFactory = null]) {
-      var params = new _FileReopenParams();
-      params.file = file;
-      params.openFlags = openFlags;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _fileMethodReopenName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    dynamic asBuffer([Function responseFactory = null]) {
-      var params = new _FileAsBufferParams();
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _fileMethodAsBufferName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    dynamic ioctl(int request,List<int> inValues,[Function responseFactory = null]) {
-      var params = new _FileIoctlParams();
-      params.request = request;
-      params.inValues = inValues;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _fileMethodIoctlName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-}
-
-
-class FileProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  File ptr;
-
-  FileProxy(_FileProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _FileProxyCalls(proxyImpl);
-
+class FileProxy extends bindings.Proxy
+                              implements File {
   FileProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _FileProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _FileProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _FileProxyControl.fromEndpoint(endpoint));
 
-  FileProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _FileProxyImpl.fromHandle(handle) {
-    ptr = new _FileProxyCalls(impl);
-  }
+  FileProxy.fromHandle(core.MojoHandle handle)
+      : super(new _FileProxyControl.fromHandle(handle));
 
-  FileProxy.unbound() :
-      impl = new _FileProxyImpl.unbound() {
-    ptr = new _FileProxyCalls(impl);
+  FileProxy.unbound()
+      : super(new _FileProxyControl.unbound());
+
+  static FileProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For FileProxy"));
+    return new FileProxy.fromEndpoint(endpoint);
   }
 
   factory FileProxy.connectToService(
@@ -2849,30 +2700,141 @@
     return p;
   }
 
-  static FileProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For FileProxy"));
-    return new FileProxy.fromEndpoint(endpoint);
+
+  dynamic close_([Function responseFactory = null]) {
+    var params = new _FileCloseParams();
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _fileMethodCloseName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
-
-  String get serviceName => File.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
+  dynamic read(int numBytesToRead,int offset,types_mojom.Whence whence,[Function responseFactory = null]) {
+    var params = new _FileReadParams();
+    params.numBytesToRead = numBytesToRead;
+    params.offset = offset;
+    params.whence = whence;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _fileMethodReadName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
-
-  String toString() {
-    return "FileProxy($impl)";
+  dynamic write(List<int> bytesToWrite,int offset,types_mojom.Whence whence,[Function responseFactory = null]) {
+    var params = new _FileWriteParams();
+    params.bytesToWrite = bytesToWrite;
+    params.offset = offset;
+    params.whence = whence;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _fileMethodWriteName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
+  }
+  dynamic readToStream(core.MojoDataPipeProducer source,int offset,types_mojom.Whence whence,int numBytesToRead,[Function responseFactory = null]) {
+    var params = new _FileReadToStreamParams();
+    params.source = source;
+    params.offset = offset;
+    params.whence = whence;
+    params.numBytesToRead = numBytesToRead;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _fileMethodReadToStreamName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
+  }
+  dynamic writeFromStream(core.MojoDataPipeConsumer sink,int offset,types_mojom.Whence whence,[Function responseFactory = null]) {
+    var params = new _FileWriteFromStreamParams();
+    params.sink = sink;
+    params.offset = offset;
+    params.whence = whence;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _fileMethodWriteFromStreamName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
+  }
+  dynamic tell([Function responseFactory = null]) {
+    var params = new _FileTellParams();
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _fileMethodTellName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
+  }
+  dynamic seek(int offset,types_mojom.Whence whence,[Function responseFactory = null]) {
+    var params = new _FileSeekParams();
+    params.offset = offset;
+    params.whence = whence;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _fileMethodSeekName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
+  }
+  dynamic stat([Function responseFactory = null]) {
+    var params = new _FileStatParams();
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _fileMethodStatName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
+  }
+  dynamic truncate(int size,[Function responseFactory = null]) {
+    var params = new _FileTruncateParams();
+    params.size = size;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _fileMethodTruncateName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
+  }
+  dynamic touch(types_mojom.TimespecOrNow atime,types_mojom.TimespecOrNow mtime,[Function responseFactory = null]) {
+    var params = new _FileTouchParams();
+    params.atime = atime;
+    params.mtime = mtime;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _fileMethodTouchName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
+  }
+  dynamic dup(Object file,[Function responseFactory = null]) {
+    var params = new _FileDupParams();
+    params.file = file;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _fileMethodDupName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
+  }
+  dynamic reopen(Object file,int openFlags,[Function responseFactory = null]) {
+    var params = new _FileReopenParams();
+    params.file = file;
+    params.openFlags = openFlags;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _fileMethodReopenName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
+  }
+  dynamic asBuffer([Function responseFactory = null]) {
+    var params = new _FileAsBufferParams();
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _fileMethodAsBufferName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
+  }
+  dynamic ioctl(int request,List<int> inValues,[Function responseFactory = null]) {
+    var params = new _FileIoctlParams();
+    params.request = request;
+    params.inValues = inValues;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _fileMethodIoctlName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
 }
 
@@ -2990,7 +2952,7 @@
     }
     switch (message.header.type) {
       case _fileMethodCloseName:
-        var response = _impl.close(_fileCloseResponseParamsFactory);
+        var response = _impl.close_(_fileCloseResponseParamsFactory);
         if (response is Future) {
           return response.then((response) {
             if (response != null) {
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 38b21f7..323c8af 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
@@ -190,24 +190,22 @@
 }
 
 
-class _FilesProxyImpl extends bindings.Proxy {
-  _FilesProxyImpl.fromEndpoint(
+class _FilesProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _FilesProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _FilesProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _FilesProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _FilesProxyImpl.unbound() : super.unbound();
-
-  static _FilesProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _FilesProxyImpl"));
-    return new _FilesProxyImpl.fromEndpoint(endpoint);
-  }
+  _FilesProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _FilesServiceDescription();
+      new _FilesServiceDescription();
 
+  String get serviceName => Files.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _filesMethodOpenFileSystemName:
@@ -237,52 +235,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_FilesProxyImpl($superString)";
+    return "_FilesProxyControl($superString)";
   }
 }
 
 
-class _FilesProxyCalls implements Files {
-  _FilesProxyImpl _proxyImpl;
-
-  _FilesProxyCalls(this._proxyImpl);
-    dynamic openFileSystem(String fileSystem,Object directory,[Function responseFactory = null]) {
-      var params = new _FilesOpenFileSystemParams();
-      params.fileSystem = fileSystem;
-      params.directory = directory;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _filesMethodOpenFileSystemName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-}
-
-
-class FilesProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  Files ptr;
-
-  FilesProxy(_FilesProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _FilesProxyCalls(proxyImpl);
-
+class FilesProxy extends bindings.Proxy
+                              implements Files {
   FilesProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _FilesProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _FilesProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _FilesProxyControl.fromEndpoint(endpoint));
 
-  FilesProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _FilesProxyImpl.fromHandle(handle) {
-    ptr = new _FilesProxyCalls(impl);
-  }
+  FilesProxy.fromHandle(core.MojoHandle handle)
+      : super(new _FilesProxyControl.fromHandle(handle));
 
-  FilesProxy.unbound() :
-      impl = new _FilesProxyImpl.unbound() {
-    ptr = new _FilesProxyCalls(impl);
+  FilesProxy.unbound()
+      : super(new _FilesProxyControl.unbound());
+
+  static FilesProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For FilesProxy"));
+    return new FilesProxy.fromEndpoint(endpoint);
   }
 
   factory FilesProxy.connectToService(
@@ -292,30 +268,16 @@
     return p;
   }
 
-  static FilesProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For FilesProxy"));
-    return new FilesProxy.fromEndpoint(endpoint);
-  }
 
-  String get serviceName => Files.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "FilesProxy($impl)";
+  dynamic openFileSystem(String fileSystem,Object directory,[Function responseFactory = null]) {
+    var params = new _FilesOpenFileSystemParams();
+    params.fileSystem = fileSystem;
+    params.directory = directory;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _filesMethodOpenFileSystemName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
 }
 
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 2c299bd..53bbafa 100644
--- a/mojo/dart/packages/mojo_services/lib/mojo/geocoder.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/mojo/geocoder.mojom.dart
@@ -1105,24 +1105,22 @@
 }
 
 
-class _GeocoderProxyImpl extends bindings.Proxy {
-  _GeocoderProxyImpl.fromEndpoint(
+class _GeocoderProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _GeocoderProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _GeocoderProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _GeocoderProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _GeocoderProxyImpl.unbound() : super.unbound();
-
-  static _GeocoderProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _GeocoderProxyImpl"));
-    return new _GeocoderProxyImpl.fromEndpoint(endpoint);
-  }
+  _GeocoderProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _GeocoderServiceDescription();
+      new _GeocoderServiceDescription();
 
+  String get serviceName => Geocoder.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _geocoderMethodAddressToLocationName:
@@ -1172,62 +1170,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_GeocoderProxyImpl($superString)";
+    return "_GeocoderProxyControl($superString)";
   }
 }
 
 
-class _GeocoderProxyCalls implements Geocoder {
-  _GeocoderProxyImpl _proxyImpl;
-
-  _GeocoderProxyCalls(this._proxyImpl);
-    dynamic addressToLocation(String address,Options options,[Function responseFactory = null]) {
-      var params = new _GeocoderAddressToLocationParams();
-      params.address = address;
-      params.options = options;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _geocoderMethodAddressToLocationName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    dynamic locationToAddress(location_mojom.Location location,Options options,[Function responseFactory = null]) {
-      var params = new _GeocoderLocationToAddressParams();
-      params.location = location;
-      params.options = options;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _geocoderMethodLocationToAddressName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-}
-
-
-class GeocoderProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  Geocoder ptr;
-
-  GeocoderProxy(_GeocoderProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _GeocoderProxyCalls(proxyImpl);
-
+class GeocoderProxy extends bindings.Proxy
+                              implements Geocoder {
   GeocoderProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _GeocoderProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _GeocoderProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _GeocoderProxyControl.fromEndpoint(endpoint));
 
-  GeocoderProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _GeocoderProxyImpl.fromHandle(handle) {
-    ptr = new _GeocoderProxyCalls(impl);
-  }
+  GeocoderProxy.fromHandle(core.MojoHandle handle)
+      : super(new _GeocoderProxyControl.fromHandle(handle));
 
-  GeocoderProxy.unbound() :
-      impl = new _GeocoderProxyImpl.unbound() {
-    ptr = new _GeocoderProxyCalls(impl);
+  GeocoderProxy.unbound()
+      : super(new _GeocoderProxyControl.unbound());
+
+  static GeocoderProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For GeocoderProxy"));
+    return new GeocoderProxy.fromEndpoint(endpoint);
   }
 
   factory GeocoderProxy.connectToService(
@@ -1237,30 +1203,26 @@
     return p;
   }
 
-  static GeocoderProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For GeocoderProxy"));
-    return new GeocoderProxy.fromEndpoint(endpoint);
+
+  dynamic addressToLocation(String address,Options options,[Function responseFactory = null]) {
+    var params = new _GeocoderAddressToLocationParams();
+    params.address = address;
+    params.options = options;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _geocoderMethodAddressToLocationName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
-
-  String get serviceName => Geocoder.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "GeocoderProxy($impl)";
+  dynamic locationToAddress(location_mojom.Location location,Options options,[Function responseFactory = null]) {
+    var params = new _GeocoderLocationToAddressParams();
+    params.location = location;
+    params.options = options;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _geocoderMethodLocationToAddressName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
 }
 
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 b7fe78c..944fb02 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
@@ -289,24 +289,22 @@
 }
 
 
-class _CompositorProxyImpl extends bindings.Proxy {
-  _CompositorProxyImpl.fromEndpoint(
+class _CompositorProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _CompositorProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _CompositorProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _CompositorProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _CompositorProxyImpl.unbound() : super.unbound();
-
-  static _CompositorProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _CompositorProxyImpl"));
-    return new _CompositorProxyImpl.fromEndpoint(endpoint);
-  }
+  _CompositorProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _CompositorServiceDescription();
+      new _CompositorServiceDescription();
 
+  String get serviceName => Compositor.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _compositorMethodCreateSceneName:
@@ -336,63 +334,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_CompositorProxyImpl($superString)";
+    return "_CompositorProxyControl($superString)";
   }
 }
 
 
-class _CompositorProxyCalls implements Compositor {
-  _CompositorProxyImpl _proxyImpl;
-
-  _CompositorProxyCalls(this._proxyImpl);
-    dynamic createScene(Object scene,String label,[Function responseFactory = null]) {
-      var params = new _CompositorCreateSceneParams();
-      params.scene = scene;
-      params.label = label;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _compositorMethodCreateSceneName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    void createRenderer(Object contextProvider, Object renderer, String label) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _CompositorCreateRendererParams();
-      params.contextProvider = contextProvider;
-      params.renderer = renderer;
-      params.label = label;
-      _proxyImpl.sendMessage(params, _compositorMethodCreateRendererName);
-    }
-}
-
-
-class CompositorProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  Compositor ptr;
-
-  CompositorProxy(_CompositorProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _CompositorProxyCalls(proxyImpl);
-
+class CompositorProxy extends bindings.Proxy
+                              implements Compositor {
   CompositorProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _CompositorProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _CompositorProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _CompositorProxyControl.fromEndpoint(endpoint));
 
-  CompositorProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _CompositorProxyImpl.fromHandle(handle) {
-    ptr = new _CompositorProxyCalls(impl);
-  }
+  CompositorProxy.fromHandle(core.MojoHandle handle)
+      : super(new _CompositorProxyControl.fromHandle(handle));
 
-  CompositorProxy.unbound() :
-      impl = new _CompositorProxyImpl.unbound() {
-    ptr = new _CompositorProxyCalls(impl);
+  CompositorProxy.unbound()
+      : super(new _CompositorProxyControl.unbound());
+
+  static CompositorProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For CompositorProxy"));
+    return new CompositorProxy.fromEndpoint(endpoint);
   }
 
   factory CompositorProxy.connectToService(
@@ -402,30 +367,28 @@
     return p;
   }
 
-  static CompositorProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For CompositorProxy"));
-    return new CompositorProxy.fromEndpoint(endpoint);
+
+  dynamic createScene(Object scene,String label,[Function responseFactory = null]) {
+    var params = new _CompositorCreateSceneParams();
+    params.scene = scene;
+    params.label = label;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _compositorMethodCreateSceneName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
-
-  String get serviceName => Compositor.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "CompositorProxy($impl)";
+  void createRenderer(Object contextProvider, Object renderer, String label) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _CompositorCreateRendererParams();
+    params.contextProvider = contextProvider;
+    params.renderer = renderer;
+    params.label = label;
+    ctrl.sendMessage(params,
+        _compositorMethodCreateRendererName);
   }
 }
 
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 831038d..e2c47a2 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
@@ -725,24 +725,22 @@
 }
 
 
-class _HitTesterProxyImpl extends bindings.Proxy {
-  _HitTesterProxyImpl.fromEndpoint(
+class _HitTesterProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _HitTesterProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _HitTesterProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _HitTesterProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _HitTesterProxyImpl.unbound() : super.unbound();
-
-  static _HitTesterProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _HitTesterProxyImpl"));
-    return new _HitTesterProxyImpl.fromEndpoint(endpoint);
-  }
+  _HitTesterProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _HitTesterServiceDescription();
+      new _HitTesterServiceDescription();
 
+  String get serviceName => HitTester.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _hitTesterMethodHitTestName:
@@ -772,51 +770,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_HitTesterProxyImpl($superString)";
+    return "_HitTesterProxyControl($superString)";
   }
 }
 
 
-class _HitTesterProxyCalls implements HitTester {
-  _HitTesterProxyImpl _proxyImpl;
-
-  _HitTesterProxyCalls(this._proxyImpl);
-    dynamic hitTest(geometry_mojom.PointF point,[Function responseFactory = null]) {
-      var params = new _HitTesterHitTestParams();
-      params.point = point;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _hitTesterMethodHitTestName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-}
-
-
-class HitTesterProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  HitTester ptr;
-
-  HitTesterProxy(_HitTesterProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _HitTesterProxyCalls(proxyImpl);
-
+class HitTesterProxy extends bindings.Proxy
+                              implements HitTester {
   HitTesterProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _HitTesterProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _HitTesterProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _HitTesterProxyControl.fromEndpoint(endpoint));
 
-  HitTesterProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _HitTesterProxyImpl.fromHandle(handle) {
-    ptr = new _HitTesterProxyCalls(impl);
-  }
+  HitTesterProxy.fromHandle(core.MojoHandle handle)
+      : super(new _HitTesterProxyControl.fromHandle(handle));
 
-  HitTesterProxy.unbound() :
-      impl = new _HitTesterProxyImpl.unbound() {
-    ptr = new _HitTesterProxyCalls(impl);
+  HitTesterProxy.unbound()
+      : super(new _HitTesterProxyControl.unbound());
+
+  static HitTesterProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For HitTesterProxy"));
+    return new HitTesterProxy.fromEndpoint(endpoint);
   }
 
   factory HitTesterProxy.connectToService(
@@ -826,30 +803,15 @@
     return p;
   }
 
-  static HitTesterProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For HitTesterProxy"));
-    return new HitTesterProxy.fromEndpoint(endpoint);
-  }
 
-  String get serviceName => HitTester.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "HitTesterProxy($impl)";
+  dynamic hitTest(geometry_mojom.PointF point,[Function responseFactory = null]) {
+    var params = new _HitTesterHitTestParams();
+    params.point = point;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _hitTesterMethodHitTestName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
 }
 
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 3b55c82..58f8038 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
@@ -266,24 +266,22 @@
 }
 
 
-class _RendererProxyImpl extends bindings.Proxy {
-  _RendererProxyImpl.fromEndpoint(
+class _RendererProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _RendererProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _RendererProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _RendererProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _RendererProxyImpl.unbound() : super.unbound();
-
-  static _RendererProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _RendererProxyImpl"));
-    return new _RendererProxyImpl.fromEndpoint(endpoint);
-  }
+  _RendererProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _RendererServiceDescription();
+      new _RendererServiceDescription();
 
+  String get serviceName => Renderer.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -293,70 +291,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_RendererProxyImpl($superString)";
+    return "_RendererProxyControl($superString)";
   }
 }
 
 
-class _RendererProxyCalls implements Renderer {
-  _RendererProxyImpl _proxyImpl;
-
-  _RendererProxyCalls(this._proxyImpl);
-    void setRootScene(scene_token_mojom.SceneToken sceneToken, int sceneVersion, geometry_mojom.Rect viewport) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _RendererSetRootSceneParams();
-      params.sceneToken = sceneToken;
-      params.sceneVersion = sceneVersion;
-      params.viewport = viewport;
-      _proxyImpl.sendMessage(params, _rendererMethodSetRootSceneName);
-    }
-    void clearRootScene() {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _RendererClearRootSceneParams();
-      _proxyImpl.sendMessage(params, _rendererMethodClearRootSceneName);
-    }
-    void getHitTester(Object hitTester) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _RendererGetHitTesterParams();
-      params.hitTester = hitTester;
-      _proxyImpl.sendMessage(params, _rendererMethodGetHitTesterName);
-    }
-}
-
-
-class RendererProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  Renderer ptr;
-
-  RendererProxy(_RendererProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _RendererProxyCalls(proxyImpl);
-
+class RendererProxy extends bindings.Proxy
+                              implements Renderer {
   RendererProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _RendererProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _RendererProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _RendererProxyControl.fromEndpoint(endpoint));
 
-  RendererProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _RendererProxyImpl.fromHandle(handle) {
-    ptr = new _RendererProxyCalls(impl);
-  }
+  RendererProxy.fromHandle(core.MojoHandle handle)
+      : super(new _RendererProxyControl.fromHandle(handle));
 
-  RendererProxy.unbound() :
-      impl = new _RendererProxyImpl.unbound() {
-    ptr = new _RendererProxyCalls(impl);
+  RendererProxy.unbound()
+      : super(new _RendererProxyControl.unbound());
+
+  static RendererProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For RendererProxy"));
+    return new RendererProxy.fromEndpoint(endpoint);
   }
 
   factory RendererProxy.connectToService(
@@ -366,30 +324,37 @@
     return p;
   }
 
-  static RendererProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For RendererProxy"));
-    return new RendererProxy.fromEndpoint(endpoint);
+
+  void setRootScene(scene_token_mojom.SceneToken sceneToken, int sceneVersion, geometry_mojom.Rect viewport) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _RendererSetRootSceneParams();
+    params.sceneToken = sceneToken;
+    params.sceneVersion = sceneVersion;
+    params.viewport = viewport;
+    ctrl.sendMessage(params,
+        _rendererMethodSetRootSceneName);
   }
-
-  String get serviceName => Renderer.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
+  void clearRootScene() {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _RendererClearRootSceneParams();
+    ctrl.sendMessage(params,
+        _rendererMethodClearRootSceneName);
   }
-
-  String toString() {
-    return "RendererProxy($impl)";
+  void getHitTester(Object hitTester) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _RendererGetHitTesterParams();
+    params.hitTester = hitTester;
+    ctrl.sendMessage(params,
+        _rendererMethodGetHitTesterName);
   }
 }
 
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 0a79e6a..b98173f 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
@@ -446,24 +446,22 @@
 }
 
 
-class _MailboxTextureCallbackProxyImpl extends bindings.Proxy {
-  _MailboxTextureCallbackProxyImpl.fromEndpoint(
+class _MailboxTextureCallbackProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _MailboxTextureCallbackProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _MailboxTextureCallbackProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _MailboxTextureCallbackProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _MailboxTextureCallbackProxyImpl.unbound() : super.unbound();
-
-  static _MailboxTextureCallbackProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _MailboxTextureCallbackProxyImpl"));
-    return new _MailboxTextureCallbackProxyImpl.fromEndpoint(endpoint);
-  }
+  _MailboxTextureCallbackProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _MailboxTextureCallbackServiceDescription();
+      new _MailboxTextureCallbackServiceDescription();
 
+  String get serviceName => MailboxTextureCallback.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -473,50 +471,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_MailboxTextureCallbackProxyImpl($superString)";
+    return "_MailboxTextureCallbackProxyControl($superString)";
   }
 }
 
 
-class _MailboxTextureCallbackProxyCalls implements MailboxTextureCallback {
-  _MailboxTextureCallbackProxyImpl _proxyImpl;
-
-  _MailboxTextureCallbackProxyCalls(this._proxyImpl);
-    void onMailboxTextureReleased() {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _MailboxTextureCallbackOnMailboxTextureReleasedParams();
-      _proxyImpl.sendMessage(params, _mailboxTextureCallbackMethodOnMailboxTextureReleasedName);
-    }
-}
-
-
-class MailboxTextureCallbackProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  MailboxTextureCallback ptr;
-
-  MailboxTextureCallbackProxy(_MailboxTextureCallbackProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _MailboxTextureCallbackProxyCalls(proxyImpl);
-
+class MailboxTextureCallbackProxy extends bindings.Proxy
+                              implements MailboxTextureCallback {
   MailboxTextureCallbackProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _MailboxTextureCallbackProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _MailboxTextureCallbackProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _MailboxTextureCallbackProxyControl.fromEndpoint(endpoint));
 
-  MailboxTextureCallbackProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _MailboxTextureCallbackProxyImpl.fromHandle(handle) {
-    ptr = new _MailboxTextureCallbackProxyCalls(impl);
-  }
+  MailboxTextureCallbackProxy.fromHandle(core.MojoHandle handle)
+      : super(new _MailboxTextureCallbackProxyControl.fromHandle(handle));
 
-  MailboxTextureCallbackProxy.unbound() :
-      impl = new _MailboxTextureCallbackProxyImpl.unbound() {
-    ptr = new _MailboxTextureCallbackProxyCalls(impl);
+  MailboxTextureCallbackProxy.unbound()
+      : super(new _MailboxTextureCallbackProxyControl.unbound());
+
+  static MailboxTextureCallbackProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For MailboxTextureCallbackProxy"));
+    return new MailboxTextureCallbackProxy.fromEndpoint(endpoint);
   }
 
   factory MailboxTextureCallbackProxy.connectToService(
@@ -526,30 +504,15 @@
     return p;
   }
 
-  static MailboxTextureCallbackProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For MailboxTextureCallbackProxy"));
-    return new MailboxTextureCallbackProxy.fromEndpoint(endpoint);
-  }
 
-  String get serviceName => MailboxTextureCallback.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "MailboxTextureCallbackProxy($impl)";
+  void onMailboxTextureReleased() {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _MailboxTextureCallbackOnMailboxTextureReleasedParams();
+    ctrl.sendMessage(params,
+        _mailboxTextureCallbackMethodOnMailboxTextureReleasedName);
   }
 }
 
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 6dce758..0c2a95e 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
@@ -731,24 +731,22 @@
 }
 
 
-class _SceneProxyImpl extends bindings.Proxy {
-  _SceneProxyImpl.fromEndpoint(
+class _SceneProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _SceneProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _SceneProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _SceneProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _SceneProxyImpl.unbound() : super.unbound();
-
-  static _SceneProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _SceneProxyImpl"));
-    return new _SceneProxyImpl.fromEndpoint(endpoint);
-  }
+  _SceneProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _SceneServiceDescription();
+      new _SceneServiceDescription();
 
+  String get serviceName => Scene.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -758,78 +756,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_SceneProxyImpl($superString)";
+    return "_SceneProxyControl($superString)";
   }
 }
 
 
-class _SceneProxyCalls implements Scene {
-  _SceneProxyImpl _proxyImpl;
-
-  _SceneProxyCalls(this._proxyImpl);
-    void setListener(Object listener) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _SceneSetListenerParams();
-      params.listener = listener;
-      _proxyImpl.sendMessage(params, _sceneMethodSetListenerName);
-    }
-    void update(SceneUpdate update) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _SceneUpdateParams();
-      params.update = update;
-      _proxyImpl.sendMessage(params, _sceneMethodUpdateName);
-    }
-    void publish(SceneMetadata metadata) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _ScenePublishParams();
-      params.metadata = metadata;
-      _proxyImpl.sendMessage(params, _sceneMethodPublishName);
-    }
-    void getScheduler(Object scheduler) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _SceneGetSchedulerParams();
-      params.scheduler = scheduler;
-      _proxyImpl.sendMessage(params, _sceneMethodGetSchedulerName);
-    }
-}
-
-
-class SceneProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  Scene ptr;
-
-  SceneProxy(_SceneProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _SceneProxyCalls(proxyImpl);
-
+class SceneProxy extends bindings.Proxy
+                              implements Scene {
   SceneProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _SceneProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _SceneProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _SceneProxyControl.fromEndpoint(endpoint));
 
-  SceneProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _SceneProxyImpl.fromHandle(handle) {
-    ptr = new _SceneProxyCalls(impl);
-  }
+  SceneProxy.fromHandle(core.MojoHandle handle)
+      : super(new _SceneProxyControl.fromHandle(handle));
 
-  SceneProxy.unbound() :
-      impl = new _SceneProxyImpl.unbound() {
-    ptr = new _SceneProxyCalls(impl);
+  SceneProxy.unbound()
+      : super(new _SceneProxyControl.unbound());
+
+  static SceneProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For SceneProxy"));
+    return new SceneProxy.fromEndpoint(endpoint);
   }
 
   factory SceneProxy.connectToService(
@@ -839,30 +789,46 @@
     return p;
   }
 
-  static SceneProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For SceneProxy"));
-    return new SceneProxy.fromEndpoint(endpoint);
+
+  void setListener(Object listener) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _SceneSetListenerParams();
+    params.listener = listener;
+    ctrl.sendMessage(params,
+        _sceneMethodSetListenerName);
   }
-
-  String get serviceName => Scene.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
+  void update(SceneUpdate update) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _SceneUpdateParams();
+    params.update = update;
+    ctrl.sendMessage(params,
+        _sceneMethodUpdateName);
   }
-
-  String toString() {
-    return "SceneProxy($impl)";
+  void publish(SceneMetadata metadata) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _ScenePublishParams();
+    params.metadata = metadata;
+    ctrl.sendMessage(params,
+        _sceneMethodPublishName);
+  }
+  void getScheduler(Object scheduler) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _SceneGetSchedulerParams();
+    params.scheduler = scheduler;
+    ctrl.sendMessage(params,
+        _sceneMethodGetSchedulerName);
   }
 }
 
@@ -983,24 +949,22 @@
 }
 
 
-class _SceneListenerProxyImpl extends bindings.Proxy {
-  _SceneListenerProxyImpl.fromEndpoint(
+class _SceneListenerProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _SceneListenerProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _SceneListenerProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _SceneListenerProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _SceneListenerProxyImpl.unbound() : super.unbound();
-
-  static _SceneListenerProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _SceneListenerProxyImpl"));
-    return new _SceneListenerProxyImpl.fromEndpoint(endpoint);
-  }
+  _SceneListenerProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _SceneListenerServiceDescription();
+      new _SceneListenerServiceDescription();
 
+  String get serviceName => SceneListener.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _sceneListenerMethodOnResourceUnavailableName:
@@ -1030,51 +994,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_SceneListenerProxyImpl($superString)";
+    return "_SceneListenerProxyControl($superString)";
   }
 }
 
 
-class _SceneListenerProxyCalls implements SceneListener {
-  _SceneListenerProxyImpl _proxyImpl;
-
-  _SceneListenerProxyCalls(this._proxyImpl);
-    dynamic onResourceUnavailable(int resourceId,[Function responseFactory = null]) {
-      var params = new _SceneListenerOnResourceUnavailableParams();
-      params.resourceId = resourceId;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _sceneListenerMethodOnResourceUnavailableName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-}
-
-
-class SceneListenerProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  SceneListener ptr;
-
-  SceneListenerProxy(_SceneListenerProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _SceneListenerProxyCalls(proxyImpl);
-
+class SceneListenerProxy extends bindings.Proxy
+                              implements SceneListener {
   SceneListenerProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _SceneListenerProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _SceneListenerProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _SceneListenerProxyControl.fromEndpoint(endpoint));
 
-  SceneListenerProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _SceneListenerProxyImpl.fromHandle(handle) {
-    ptr = new _SceneListenerProxyCalls(impl);
-  }
+  SceneListenerProxy.fromHandle(core.MojoHandle handle)
+      : super(new _SceneListenerProxyControl.fromHandle(handle));
 
-  SceneListenerProxy.unbound() :
-      impl = new _SceneListenerProxyImpl.unbound() {
-    ptr = new _SceneListenerProxyCalls(impl);
+  SceneListenerProxy.unbound()
+      : super(new _SceneListenerProxyControl.unbound());
+
+  static SceneListenerProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For SceneListenerProxy"));
+    return new SceneListenerProxy.fromEndpoint(endpoint);
   }
 
   factory SceneListenerProxy.connectToService(
@@ -1084,30 +1027,15 @@
     return p;
   }
 
-  static SceneListenerProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For SceneListenerProxy"));
-    return new SceneListenerProxy.fromEndpoint(endpoint);
-  }
 
-  String get serviceName => SceneListener.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "SceneListenerProxy($impl)";
+  dynamic onResourceUnavailable(int resourceId,[Function responseFactory = null]) {
+    var params = new _SceneListenerOnResourceUnavailableParams();
+    params.resourceId = resourceId;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _sceneListenerMethodOnResourceUnavailableName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
 }
 
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 d6905b9..d458eed 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
@@ -273,24 +273,22 @@
 }
 
 
-class _SceneSchedulerProxyImpl extends bindings.Proxy {
-  _SceneSchedulerProxyImpl.fromEndpoint(
+class _SceneSchedulerProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _SceneSchedulerProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _SceneSchedulerProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _SceneSchedulerProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _SceneSchedulerProxyImpl.unbound() : super.unbound();
-
-  static _SceneSchedulerProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _SceneSchedulerProxyImpl"));
-    return new _SceneSchedulerProxyImpl.fromEndpoint(endpoint);
-  }
+  _SceneSchedulerProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _SceneSchedulerServiceDescription();
+      new _SceneSchedulerServiceDescription();
 
+  String get serviceName => SceneScheduler.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _sceneSchedulerMethodScheduleFrameName:
@@ -320,50 +318,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_SceneSchedulerProxyImpl($superString)";
+    return "_SceneSchedulerProxyControl($superString)";
   }
 }
 
 
-class _SceneSchedulerProxyCalls implements SceneScheduler {
-  _SceneSchedulerProxyImpl _proxyImpl;
-
-  _SceneSchedulerProxyCalls(this._proxyImpl);
-    dynamic scheduleFrame([Function responseFactory = null]) {
-      var params = new _SceneSchedulerScheduleFrameParams();
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _sceneSchedulerMethodScheduleFrameName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-}
-
-
-class SceneSchedulerProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  SceneScheduler ptr;
-
-  SceneSchedulerProxy(_SceneSchedulerProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _SceneSchedulerProxyCalls(proxyImpl);
-
+class SceneSchedulerProxy extends bindings.Proxy
+                              implements SceneScheduler {
   SceneSchedulerProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _SceneSchedulerProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _SceneSchedulerProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _SceneSchedulerProxyControl.fromEndpoint(endpoint));
 
-  SceneSchedulerProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _SceneSchedulerProxyImpl.fromHandle(handle) {
-    ptr = new _SceneSchedulerProxyCalls(impl);
-  }
+  SceneSchedulerProxy.fromHandle(core.MojoHandle handle)
+      : super(new _SceneSchedulerProxyControl.fromHandle(handle));
 
-  SceneSchedulerProxy.unbound() :
-      impl = new _SceneSchedulerProxyImpl.unbound() {
-    ptr = new _SceneSchedulerProxyCalls(impl);
+  SceneSchedulerProxy.unbound()
+      : super(new _SceneSchedulerProxyControl.unbound());
+
+  static SceneSchedulerProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For SceneSchedulerProxy"));
+    return new SceneSchedulerProxy.fromEndpoint(endpoint);
   }
 
   factory SceneSchedulerProxy.connectToService(
@@ -373,30 +351,14 @@
     return p;
   }
 
-  static SceneSchedulerProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For SceneSchedulerProxy"));
-    return new SceneSchedulerProxy.fromEndpoint(endpoint);
-  }
 
-  String get serviceName => SceneScheduler.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "SceneSchedulerProxy($impl)";
+  dynamic scheduleFrame([Function responseFactory = null]) {
+    var params = new _SceneSchedulerScheduleFrameParams();
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _sceneSchedulerMethodScheduleFrameName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
 }
 
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 9bd255e..62c8f73 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
@@ -225,24 +225,22 @@
 }
 
 
-class _HostResolverProxyImpl extends bindings.Proxy {
-  _HostResolverProxyImpl.fromEndpoint(
+class _HostResolverProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _HostResolverProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _HostResolverProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _HostResolverProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _HostResolverProxyImpl.unbound() : super.unbound();
-
-  static _HostResolverProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _HostResolverProxyImpl"));
-    return new _HostResolverProxyImpl.fromEndpoint(endpoint);
-  }
+  _HostResolverProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _HostResolverServiceDescription();
+      new _HostResolverServiceDescription();
 
+  String get serviceName => HostResolver.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _hostResolverMethodGetHostAddressesName:
@@ -272,52 +270,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_HostResolverProxyImpl($superString)";
+    return "_HostResolverProxyControl($superString)";
   }
 }
 
 
-class _HostResolverProxyCalls implements HostResolver {
-  _HostResolverProxyImpl _proxyImpl;
-
-  _HostResolverProxyCalls(this._proxyImpl);
-    dynamic getHostAddresses(String host,net_address_mojom.NetAddressFamily family,[Function responseFactory = null]) {
-      var params = new _HostResolverGetHostAddressesParams();
-      params.host = host;
-      params.family = family;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _hostResolverMethodGetHostAddressesName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-}
-
-
-class HostResolverProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  HostResolver ptr;
-
-  HostResolverProxy(_HostResolverProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _HostResolverProxyCalls(proxyImpl);
-
+class HostResolverProxy extends bindings.Proxy
+                              implements HostResolver {
   HostResolverProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _HostResolverProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _HostResolverProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _HostResolverProxyControl.fromEndpoint(endpoint));
 
-  HostResolverProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _HostResolverProxyImpl.fromHandle(handle) {
-    ptr = new _HostResolverProxyCalls(impl);
-  }
+  HostResolverProxy.fromHandle(core.MojoHandle handle)
+      : super(new _HostResolverProxyControl.fromHandle(handle));
 
-  HostResolverProxy.unbound() :
-      impl = new _HostResolverProxyImpl.unbound() {
-    ptr = new _HostResolverProxyCalls(impl);
+  HostResolverProxy.unbound()
+      : super(new _HostResolverProxyControl.unbound());
+
+  static HostResolverProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For HostResolverProxy"));
+    return new HostResolverProxy.fromEndpoint(endpoint);
   }
 
   factory HostResolverProxy.connectToService(
@@ -327,30 +303,16 @@
     return p;
   }
 
-  static HostResolverProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For HostResolverProxy"));
-    return new HostResolverProxy.fromEndpoint(endpoint);
-  }
 
-  String get serviceName => HostResolver.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "HostResolverProxy($impl)";
+  dynamic getHostAddresses(String host,net_address_mojom.NetAddressFamily family,[Function responseFactory = null]) {
+    var params = new _HostResolverGetHostAddressesParams();
+    params.host = host;
+    params.family = family;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _hostResolverMethodGetHostAddressesName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
 }
 
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 a9bc477..4a71887 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
@@ -636,24 +636,22 @@
 }
 
 
-class _HttpConnectionProxyImpl extends bindings.Proxy {
-  _HttpConnectionProxyImpl.fromEndpoint(
+class _HttpConnectionProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _HttpConnectionProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _HttpConnectionProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _HttpConnectionProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _HttpConnectionProxyImpl.unbound() : super.unbound();
-
-  static _HttpConnectionProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _HttpConnectionProxyImpl"));
-    return new _HttpConnectionProxyImpl.fromEndpoint(endpoint);
-  }
+  _HttpConnectionProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _HttpConnectionServiceDescription();
+      new _HttpConnectionServiceDescription();
 
+  String get serviceName => HttpConnection.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _httpConnectionMethodSetSendBufferSizeName:
@@ -703,60 +701,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_HttpConnectionProxyImpl($superString)";
+    return "_HttpConnectionProxyControl($superString)";
   }
 }
 
 
-class _HttpConnectionProxyCalls implements HttpConnection {
-  _HttpConnectionProxyImpl _proxyImpl;
-
-  _HttpConnectionProxyCalls(this._proxyImpl);
-    dynamic setSendBufferSize(int size,[Function responseFactory = null]) {
-      var params = new _HttpConnectionSetSendBufferSizeParams();
-      params.size = size;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _httpConnectionMethodSetSendBufferSizeName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    dynamic setReceiveBufferSize(int size,[Function responseFactory = null]) {
-      var params = new _HttpConnectionSetReceiveBufferSizeParams();
-      params.size = size;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _httpConnectionMethodSetReceiveBufferSizeName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-}
-
-
-class HttpConnectionProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  HttpConnection ptr;
-
-  HttpConnectionProxy(_HttpConnectionProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _HttpConnectionProxyCalls(proxyImpl);
-
+class HttpConnectionProxy extends bindings.Proxy
+                              implements HttpConnection {
   HttpConnectionProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _HttpConnectionProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _HttpConnectionProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _HttpConnectionProxyControl.fromEndpoint(endpoint));
 
-  HttpConnectionProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _HttpConnectionProxyImpl.fromHandle(handle) {
-    ptr = new _HttpConnectionProxyCalls(impl);
-  }
+  HttpConnectionProxy.fromHandle(core.MojoHandle handle)
+      : super(new _HttpConnectionProxyControl.fromHandle(handle));
 
-  HttpConnectionProxy.unbound() :
-      impl = new _HttpConnectionProxyImpl.unbound() {
-    ptr = new _HttpConnectionProxyCalls(impl);
+  HttpConnectionProxy.unbound()
+      : super(new _HttpConnectionProxyControl.unbound());
+
+  static HttpConnectionProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For HttpConnectionProxy"));
+    return new HttpConnectionProxy.fromEndpoint(endpoint);
   }
 
   factory HttpConnectionProxy.connectToService(
@@ -766,30 +734,24 @@
     return p;
   }
 
-  static HttpConnectionProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For HttpConnectionProxy"));
-    return new HttpConnectionProxy.fromEndpoint(endpoint);
+
+  dynamic setSendBufferSize(int size,[Function responseFactory = null]) {
+    var params = new _HttpConnectionSetSendBufferSizeParams();
+    params.size = size;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _httpConnectionMethodSetSendBufferSizeName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
-
-  String get serviceName => HttpConnection.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "HttpConnectionProxy($impl)";
+  dynamic setReceiveBufferSize(int size,[Function responseFactory = null]) {
+    var params = new _HttpConnectionSetReceiveBufferSizeParams();
+    params.size = size;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _httpConnectionMethodSetReceiveBufferSizeName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
 }
 
@@ -946,24 +908,22 @@
 }
 
 
-class _HttpConnectionDelegateProxyImpl extends bindings.Proxy {
-  _HttpConnectionDelegateProxyImpl.fromEndpoint(
+class _HttpConnectionDelegateProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _HttpConnectionDelegateProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _HttpConnectionDelegateProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _HttpConnectionDelegateProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _HttpConnectionDelegateProxyImpl.unbound() : super.unbound();
-
-  static _HttpConnectionDelegateProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _HttpConnectionDelegateProxyImpl"));
-    return new _HttpConnectionDelegateProxyImpl.fromEndpoint(endpoint);
-  }
+  _HttpConnectionDelegateProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _HttpConnectionDelegateServiceDescription();
+      new _HttpConnectionDelegateServiceDescription();
 
+  String get serviceName => HttpConnectionDelegate.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _httpConnectionDelegateMethodOnReceivedRequestName:
@@ -1013,60 +973,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_HttpConnectionDelegateProxyImpl($superString)";
+    return "_HttpConnectionDelegateProxyControl($superString)";
   }
 }
 
 
-class _HttpConnectionDelegateProxyCalls implements HttpConnectionDelegate {
-  _HttpConnectionDelegateProxyImpl _proxyImpl;
-
-  _HttpConnectionDelegateProxyCalls(this._proxyImpl);
-    dynamic onReceivedRequest(http_message_mojom.HttpRequest request,[Function responseFactory = null]) {
-      var params = new _HttpConnectionDelegateOnReceivedRequestParams();
-      params.request = request;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _httpConnectionDelegateMethodOnReceivedRequestName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    dynamic onReceivedWebSocketRequest(http_message_mojom.HttpRequest request,[Function responseFactory = null]) {
-      var params = new _HttpConnectionDelegateOnReceivedWebSocketRequestParams();
-      params.request = request;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _httpConnectionDelegateMethodOnReceivedWebSocketRequestName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-}
-
-
-class HttpConnectionDelegateProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  HttpConnectionDelegate ptr;
-
-  HttpConnectionDelegateProxy(_HttpConnectionDelegateProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _HttpConnectionDelegateProxyCalls(proxyImpl);
-
+class HttpConnectionDelegateProxy extends bindings.Proxy
+                              implements HttpConnectionDelegate {
   HttpConnectionDelegateProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _HttpConnectionDelegateProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _HttpConnectionDelegateProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _HttpConnectionDelegateProxyControl.fromEndpoint(endpoint));
 
-  HttpConnectionDelegateProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _HttpConnectionDelegateProxyImpl.fromHandle(handle) {
-    ptr = new _HttpConnectionDelegateProxyCalls(impl);
-  }
+  HttpConnectionDelegateProxy.fromHandle(core.MojoHandle handle)
+      : super(new _HttpConnectionDelegateProxyControl.fromHandle(handle));
 
-  HttpConnectionDelegateProxy.unbound() :
-      impl = new _HttpConnectionDelegateProxyImpl.unbound() {
-    ptr = new _HttpConnectionDelegateProxyCalls(impl);
+  HttpConnectionDelegateProxy.unbound()
+      : super(new _HttpConnectionDelegateProxyControl.unbound());
+
+  static HttpConnectionDelegateProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For HttpConnectionDelegateProxy"));
+    return new HttpConnectionDelegateProxy.fromEndpoint(endpoint);
   }
 
   factory HttpConnectionDelegateProxy.connectToService(
@@ -1076,30 +1006,24 @@
     return p;
   }
 
-  static HttpConnectionDelegateProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For HttpConnectionDelegateProxy"));
-    return new HttpConnectionDelegateProxy.fromEndpoint(endpoint);
+
+  dynamic onReceivedRequest(http_message_mojom.HttpRequest request,[Function responseFactory = null]) {
+    var params = new _HttpConnectionDelegateOnReceivedRequestParams();
+    params.request = request;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _httpConnectionDelegateMethodOnReceivedRequestName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
-
-  String get serviceName => HttpConnectionDelegate.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "HttpConnectionDelegateProxy($impl)";
+  dynamic onReceivedWebSocketRequest(http_message_mojom.HttpRequest request,[Function responseFactory = null]) {
+    var params = new _HttpConnectionDelegateOnReceivedWebSocketRequestParams();
+    params.request = request;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _httpConnectionDelegateMethodOnReceivedWebSocketRequestName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
 }
 
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 bd55ede..2712cb6 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
@@ -113,24 +113,22 @@
 }
 
 
-class _HttpServerDelegateProxyImpl extends bindings.Proxy {
-  _HttpServerDelegateProxyImpl.fromEndpoint(
+class _HttpServerDelegateProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _HttpServerDelegateProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _HttpServerDelegateProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _HttpServerDelegateProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _HttpServerDelegateProxyImpl.unbound() : super.unbound();
-
-  static _HttpServerDelegateProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _HttpServerDelegateProxyImpl"));
-    return new _HttpServerDelegateProxyImpl.fromEndpoint(endpoint);
-  }
+  _HttpServerDelegateProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _HttpServerDelegateServiceDescription();
+      new _HttpServerDelegateServiceDescription();
 
+  String get serviceName => HttpServerDelegate.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -140,52 +138,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_HttpServerDelegateProxyImpl($superString)";
+    return "_HttpServerDelegateProxyControl($superString)";
   }
 }
 
 
-class _HttpServerDelegateProxyCalls implements HttpServerDelegate {
-  _HttpServerDelegateProxyImpl _proxyImpl;
-
-  _HttpServerDelegateProxyCalls(this._proxyImpl);
-    void onConnected(Object connection, Object delegate) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _HttpServerDelegateOnConnectedParams();
-      params.connection = connection;
-      params.delegate = delegate;
-      _proxyImpl.sendMessage(params, _httpServerDelegateMethodOnConnectedName);
-    }
-}
-
-
-class HttpServerDelegateProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  HttpServerDelegate ptr;
-
-  HttpServerDelegateProxy(_HttpServerDelegateProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _HttpServerDelegateProxyCalls(proxyImpl);
-
+class HttpServerDelegateProxy extends bindings.Proxy
+                              implements HttpServerDelegate {
   HttpServerDelegateProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _HttpServerDelegateProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _HttpServerDelegateProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _HttpServerDelegateProxyControl.fromEndpoint(endpoint));
 
-  HttpServerDelegateProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _HttpServerDelegateProxyImpl.fromHandle(handle) {
-    ptr = new _HttpServerDelegateProxyCalls(impl);
-  }
+  HttpServerDelegateProxy.fromHandle(core.MojoHandle handle)
+      : super(new _HttpServerDelegateProxyControl.fromHandle(handle));
 
-  HttpServerDelegateProxy.unbound() :
-      impl = new _HttpServerDelegateProxyImpl.unbound() {
-    ptr = new _HttpServerDelegateProxyCalls(impl);
+  HttpServerDelegateProxy.unbound()
+      : super(new _HttpServerDelegateProxyControl.unbound());
+
+  static HttpServerDelegateProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For HttpServerDelegateProxy"));
+    return new HttpServerDelegateProxy.fromEndpoint(endpoint);
   }
 
   factory HttpServerDelegateProxy.connectToService(
@@ -195,30 +171,17 @@
     return p;
   }
 
-  static HttpServerDelegateProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For HttpServerDelegateProxy"));
-    return new HttpServerDelegateProxy.fromEndpoint(endpoint);
-  }
 
-  String get serviceName => HttpServerDelegate.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "HttpServerDelegateProxy($impl)";
+  void onConnected(Object connection, Object delegate) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _HttpServerDelegateOnConnectedParams();
+    params.connection = connection;
+    params.delegate = delegate;
+    ctrl.sendMessage(params,
+        _httpServerDelegateMethodOnConnectedName);
   }
 }
 
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 72331d7..6d28870 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
@@ -244,24 +244,22 @@
 }
 
 
-class _LocationServiceProxyImpl extends bindings.Proxy {
-  _LocationServiceProxyImpl.fromEndpoint(
+class _LocationServiceProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _LocationServiceProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _LocationServiceProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _LocationServiceProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _LocationServiceProxyImpl.unbound() : super.unbound();
-
-  static _LocationServiceProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _LocationServiceProxyImpl"));
-    return new _LocationServiceProxyImpl.fromEndpoint(endpoint);
-  }
+  _LocationServiceProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _LocationServiceServiceDescription();
+      new _LocationServiceServiceDescription();
 
+  String get serviceName => LocationService.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _locationServiceMethodGetNextLocationName:
@@ -291,51 +289,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_LocationServiceProxyImpl($superString)";
+    return "_LocationServiceProxyControl($superString)";
   }
 }
 
 
-class _LocationServiceProxyCalls implements LocationService {
-  _LocationServiceProxyImpl _proxyImpl;
-
-  _LocationServiceProxyCalls(this._proxyImpl);
-    dynamic getNextLocation(LocationServiceUpdatePriority priority,[Function responseFactory = null]) {
-      var params = new _LocationServiceGetNextLocationParams();
-      params.priority = priority;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _locationServiceMethodGetNextLocationName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-}
-
-
-class LocationServiceProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  LocationService ptr;
-
-  LocationServiceProxy(_LocationServiceProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _LocationServiceProxyCalls(proxyImpl);
-
+class LocationServiceProxy extends bindings.Proxy
+                              implements LocationService {
   LocationServiceProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _LocationServiceProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _LocationServiceProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _LocationServiceProxyControl.fromEndpoint(endpoint));
 
-  LocationServiceProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _LocationServiceProxyImpl.fromHandle(handle) {
-    ptr = new _LocationServiceProxyCalls(impl);
-  }
+  LocationServiceProxy.fromHandle(core.MojoHandle handle)
+      : super(new _LocationServiceProxyControl.fromHandle(handle));
 
-  LocationServiceProxy.unbound() :
-      impl = new _LocationServiceProxyImpl.unbound() {
-    ptr = new _LocationServiceProxyCalls(impl);
+  LocationServiceProxy.unbound()
+      : super(new _LocationServiceProxyControl.unbound());
+
+  static LocationServiceProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For LocationServiceProxy"));
+    return new LocationServiceProxy.fromEndpoint(endpoint);
   }
 
   factory LocationServiceProxy.connectToService(
@@ -345,30 +322,15 @@
     return p;
   }
 
-  static LocationServiceProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For LocationServiceProxy"));
-    return new LocationServiceProxy.fromEndpoint(endpoint);
-  }
 
-  String get serviceName => LocationService.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "LocationServiceProxy($impl)";
+  dynamic getNextLocation(LocationServiceUpdatePriority priority,[Function responseFactory = null]) {
+    var params = new _LocationServiceGetNextLocationParams();
+    params.priority = priority;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _locationServiceMethodGetNextLocationName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
 }
 
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 88ebb0d..bd61c73 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
@@ -100,24 +100,22 @@
 }
 
 
-class _AudioServerProxyImpl extends bindings.Proxy {
-  _AudioServerProxyImpl.fromEndpoint(
+class _AudioServerProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _AudioServerProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _AudioServerProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _AudioServerProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _AudioServerProxyImpl.unbound() : super.unbound();
-
-  static _AudioServerProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _AudioServerProxyImpl"));
-    return new _AudioServerProxyImpl.fromEndpoint(endpoint);
-  }
+  _AudioServerProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _AudioServerServiceDescription();
+      new _AudioServerServiceDescription();
 
+  String get serviceName => AudioServer.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -127,51 +125,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_AudioServerProxyImpl($superString)";
+    return "_AudioServerProxyControl($superString)";
   }
 }
 
 
-class _AudioServerProxyCalls implements AudioServer {
-  _AudioServerProxyImpl _proxyImpl;
-
-  _AudioServerProxyCalls(this._proxyImpl);
-    void createTrack(Object track) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _AudioServerCreateTrackParams();
-      params.track = track;
-      _proxyImpl.sendMessage(params, _audioServerMethodCreateTrackName);
-    }
-}
-
-
-class AudioServerProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  AudioServer ptr;
-
-  AudioServerProxy(_AudioServerProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _AudioServerProxyCalls(proxyImpl);
-
+class AudioServerProxy extends bindings.Proxy
+                              implements AudioServer {
   AudioServerProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _AudioServerProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _AudioServerProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _AudioServerProxyControl.fromEndpoint(endpoint));
 
-  AudioServerProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _AudioServerProxyImpl.fromHandle(handle) {
-    ptr = new _AudioServerProxyCalls(impl);
-  }
+  AudioServerProxy.fromHandle(core.MojoHandle handle)
+      : super(new _AudioServerProxyControl.fromHandle(handle));
 
-  AudioServerProxy.unbound() :
-      impl = new _AudioServerProxyImpl.unbound() {
-    ptr = new _AudioServerProxyCalls(impl);
+  AudioServerProxy.unbound()
+      : super(new _AudioServerProxyControl.unbound());
+
+  static AudioServerProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For AudioServerProxy"));
+    return new AudioServerProxy.fromEndpoint(endpoint);
   }
 
   factory AudioServerProxy.connectToService(
@@ -181,30 +158,16 @@
     return p;
   }
 
-  static AudioServerProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For AudioServerProxy"));
-    return new AudioServerProxy.fromEndpoint(endpoint);
-  }
 
-  String get serviceName => AudioServer.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "AudioServerProxy($impl)";
+  void createTrack(Object track) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _AudioServerCreateTrackParams();
+    params.track = track;
+    ctrl.sendMessage(params,
+        _audioServerMethodCreateTrackName);
   }
 }
 
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 0d79f1f..38cf4a8 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
@@ -587,24 +587,22 @@
 }
 
 
-class _AudioTrackProxyImpl extends bindings.Proxy {
-  _AudioTrackProxyImpl.fromEndpoint(
+class _AudioTrackProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _AudioTrackProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _AudioTrackProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _AudioTrackProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _AudioTrackProxyImpl.unbound() : super.unbound();
-
-  static _AudioTrackProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _AudioTrackProxyImpl"));
-    return new _AudioTrackProxyImpl.fromEndpoint(endpoint);
-  }
+  _AudioTrackProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _AudioTrackServiceDescription();
+      new _AudioTrackServiceDescription();
 
+  String get serviceName => AudioTrack.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _audioTrackMethodDescribeName:
@@ -634,78 +632,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_AudioTrackProxyImpl($superString)";
+    return "_AudioTrackProxyControl($superString)";
   }
 }
 
 
-class _AudioTrackProxyCalls implements AudioTrack {
-  _AudioTrackProxyImpl _proxyImpl;
-
-  _AudioTrackProxyCalls(this._proxyImpl);
-    dynamic describe([Function responseFactory = null]) {
-      var params = new _AudioTrackDescribeParams();
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _audioTrackMethodDescribeName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    void configure(AudioTrackConfiguration configuration, Object pipe) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _AudioTrackConfigureParams();
-      params.configuration = configuration;
-      params.pipe = pipe;
-      _proxyImpl.sendMessage(params, _audioTrackMethodConfigureName);
-    }
-    void getRateControl(Object rateControl) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _AudioTrackGetRateControlParams();
-      params.rateControl = rateControl;
-      _proxyImpl.sendMessage(params, _audioTrackMethodGetRateControlName);
-    }
-    void setGain(double dbGain) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _AudioTrackSetGainParams();
-      params.dbGain = dbGain;
-      _proxyImpl.sendMessage(params, _audioTrackMethodSetGainName);
-    }
-}
-
-
-class AudioTrackProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  AudioTrack ptr;
-
-  AudioTrackProxy(_AudioTrackProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _AudioTrackProxyCalls(proxyImpl);
-
+class AudioTrackProxy extends bindings.Proxy
+                              implements AudioTrack {
   AudioTrackProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _AudioTrackProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _AudioTrackProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _AudioTrackProxyControl.fromEndpoint(endpoint));
 
-  AudioTrackProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _AudioTrackProxyImpl.fromHandle(handle) {
-    ptr = new _AudioTrackProxyCalls(impl);
-  }
+  AudioTrackProxy.fromHandle(core.MojoHandle handle)
+      : super(new _AudioTrackProxyControl.fromHandle(handle));
 
-  AudioTrackProxy.unbound() :
-      impl = new _AudioTrackProxyImpl.unbound() {
-    ptr = new _AudioTrackProxyCalls(impl);
+  AudioTrackProxy.unbound()
+      : super(new _AudioTrackProxyControl.unbound());
+
+  static AudioTrackProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For AudioTrackProxy"));
+    return new AudioTrackProxy.fromEndpoint(endpoint);
   }
 
   factory AudioTrackProxy.connectToService(
@@ -715,30 +665,45 @@
     return p;
   }
 
-  static AudioTrackProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For AudioTrackProxy"));
-    return new AudioTrackProxy.fromEndpoint(endpoint);
+
+  dynamic describe([Function responseFactory = null]) {
+    var params = new _AudioTrackDescribeParams();
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _audioTrackMethodDescribeName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
-
-  String get serviceName => AudioTrack.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
+  void configure(AudioTrackConfiguration configuration, Object pipe) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _AudioTrackConfigureParams();
+    params.configuration = configuration;
+    params.pipe = pipe;
+    ctrl.sendMessage(params,
+        _audioTrackMethodConfigureName);
   }
-
-  String toString() {
-    return "AudioTrackProxy($impl)";
+  void getRateControl(Object rateControl) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _AudioTrackGetRateControlParams();
+    params.rateControl = rateControl;
+    ctrl.sendMessage(params,
+        _audioTrackMethodGetRateControlName);
+  }
+  void setGain(double dbGain) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _AudioTrackSetGainParams();
+    params.dbGain = dbGain;
+    ctrl.sendMessage(params,
+        _audioTrackMethodSetGainName);
   }
 }
 
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 57c0b6d..e777da4 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
@@ -793,24 +793,22 @@
 }
 
 
-class _MediaDemuxProxyImpl extends bindings.Proxy {
-  _MediaDemuxProxyImpl.fromEndpoint(
+class _MediaDemuxProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _MediaDemuxProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _MediaDemuxProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _MediaDemuxProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _MediaDemuxProxyImpl.unbound() : super.unbound();
-
-  static _MediaDemuxProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _MediaDemuxProxyImpl"));
-    return new _MediaDemuxProxyImpl.fromEndpoint(endpoint);
-  }
+  _MediaDemuxProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _MediaDemuxServiceDescription();
+      new _MediaDemuxServiceDescription();
 
+  String get serviceName => MediaDemux.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _mediaDemuxMethodDescribeName:
@@ -920,94 +918,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_MediaDemuxProxyImpl($superString)";
+    return "_MediaDemuxProxyControl($superString)";
   }
 }
 
 
-class _MediaDemuxProxyCalls implements MediaDemux {
-  _MediaDemuxProxyImpl _proxyImpl;
-
-  _MediaDemuxProxyCalls(this._proxyImpl);
-    dynamic describe([Function responseFactory = null]) {
-      var params = new _MediaDemuxDescribeParams();
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _mediaDemuxMethodDescribeName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    void getProducer(int streamIndex, Object producer) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _MediaDemuxGetProducerParams();
-      params.streamIndex = streamIndex;
-      params.producer = producer;
-      _proxyImpl.sendMessage(params, _mediaDemuxMethodGetProducerName);
-    }
-    dynamic getMetadata(int versionLastSeen,[Function responseFactory = null]) {
-      var params = new _MediaDemuxGetMetadataParams();
-      params.versionLastSeen = versionLastSeen;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _mediaDemuxMethodGetMetadataName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    dynamic prime([Function responseFactory = null]) {
-      var params = new _MediaDemuxPrimeParams();
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _mediaDemuxMethodPrimeName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    dynamic flush([Function responseFactory = null]) {
-      var params = new _MediaDemuxFlushParams();
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _mediaDemuxMethodFlushName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    dynamic seek(int position,[Function responseFactory = null]) {
-      var params = new _MediaDemuxSeekParams();
-      params.position = position;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _mediaDemuxMethodSeekName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-}
-
-
-class MediaDemuxProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  MediaDemux ptr;
-
-  MediaDemuxProxy(_MediaDemuxProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _MediaDemuxProxyCalls(proxyImpl);
-
+class MediaDemuxProxy extends bindings.Proxy
+                              implements MediaDemux {
   MediaDemuxProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _MediaDemuxProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _MediaDemuxProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _MediaDemuxProxyControl.fromEndpoint(endpoint));
 
-  MediaDemuxProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _MediaDemuxProxyImpl.fromHandle(handle) {
-    ptr = new _MediaDemuxProxyCalls(impl);
-  }
+  MediaDemuxProxy.fromHandle(core.MojoHandle handle)
+      : super(new _MediaDemuxProxyControl.fromHandle(handle));
 
-  MediaDemuxProxy.unbound() :
-      impl = new _MediaDemuxProxyImpl.unbound() {
-    ptr = new _MediaDemuxProxyCalls(impl);
+  MediaDemuxProxy.unbound()
+      : super(new _MediaDemuxProxyControl.unbound());
+
+  static MediaDemuxProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For MediaDemuxProxy"));
+    return new MediaDemuxProxy.fromEndpoint(endpoint);
   }
 
   factory MediaDemuxProxy.connectToService(
@@ -1017,30 +951,59 @@
     return p;
   }
 
-  static MediaDemuxProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For MediaDemuxProxy"));
-    return new MediaDemuxProxy.fromEndpoint(endpoint);
+
+  dynamic describe([Function responseFactory = null]) {
+    var params = new _MediaDemuxDescribeParams();
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _mediaDemuxMethodDescribeName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
-
-  String get serviceName => MediaDemux.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
+  void getProducer(int streamIndex, Object producer) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _MediaDemuxGetProducerParams();
+    params.streamIndex = streamIndex;
+    params.producer = producer;
+    ctrl.sendMessage(params,
+        _mediaDemuxMethodGetProducerName);
   }
-
-  String toString() {
-    return "MediaDemuxProxy($impl)";
+  dynamic getMetadata(int versionLastSeen,[Function responseFactory = null]) {
+    var params = new _MediaDemuxGetMetadataParams();
+    params.versionLastSeen = versionLastSeen;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _mediaDemuxMethodGetMetadataName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
+  }
+  dynamic prime([Function responseFactory = null]) {
+    var params = new _MediaDemuxPrimeParams();
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _mediaDemuxMethodPrimeName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
+  }
+  dynamic flush([Function responseFactory = null]) {
+    var params = new _MediaDemuxFlushParams();
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _mediaDemuxMethodFlushName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
+  }
+  dynamic seek(int position,[Function responseFactory = null]) {
+    var params = new _MediaDemuxSeekParams();
+    params.position = position;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _mediaDemuxMethodSeekName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
 }
 
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 8abea22..5cb1536 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
@@ -595,24 +595,22 @@
 }
 
 
-class _MediaFactoryProxyImpl extends bindings.Proxy {
-  _MediaFactoryProxyImpl.fromEndpoint(
+class _MediaFactoryProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _MediaFactoryProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _MediaFactoryProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _MediaFactoryProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _MediaFactoryProxyImpl.unbound() : super.unbound();
-
-  static _MediaFactoryProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _MediaFactoryProxyImpl"));
-    return new _MediaFactoryProxyImpl.fromEndpoint(endpoint);
-  }
+  _MediaFactoryProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _MediaFactoryServiceDescription();
+      new _MediaFactoryServiceDescription();
 
+  String get serviceName => MediaFactory.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -622,104 +620,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_MediaFactoryProxyImpl($superString)";
+    return "_MediaFactoryProxyControl($superString)";
   }
 }
 
 
-class _MediaFactoryProxyCalls implements MediaFactory {
-  _MediaFactoryProxyImpl _proxyImpl;
-
-  _MediaFactoryProxyCalls(this._proxyImpl);
-    void createPlayer(Object reader, Object player) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _MediaFactoryCreatePlayerParams();
-      params.reader = reader;
-      params.player = player;
-      _proxyImpl.sendMessage(params, _mediaFactoryMethodCreatePlayerName);
-    }
-    void createSource(Object reader, List<media_types_mojom.MediaTypeSet> allowedMediaTypes, Object source) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _MediaFactoryCreateSourceParams();
-      params.reader = reader;
-      params.allowedMediaTypes = allowedMediaTypes;
-      params.source = source;
-      _proxyImpl.sendMessage(params, _mediaFactoryMethodCreateSourceName);
-    }
-    void createSink(String destinationUrl, media_types_mojom.MediaType mediaType, Object sink) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _MediaFactoryCreateSinkParams();
-      params.destinationUrl = destinationUrl;
-      params.mediaType = mediaType;
-      params.sink = sink;
-      _proxyImpl.sendMessage(params, _mediaFactoryMethodCreateSinkName);
-    }
-    void createDemux(Object reader, Object demux) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _MediaFactoryCreateDemuxParams();
-      params.reader = reader;
-      params.demux = demux;
-      _proxyImpl.sendMessage(params, _mediaFactoryMethodCreateDemuxName);
-    }
-    void createDecoder(media_types_mojom.MediaType inputMediaType, Object decoder) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _MediaFactoryCreateDecoderParams();
-      params.inputMediaType = inputMediaType;
-      params.decoder = decoder;
-      _proxyImpl.sendMessage(params, _mediaFactoryMethodCreateDecoderName);
-    }
-    void createNetworkReader(String url, Object reader) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _MediaFactoryCreateNetworkReaderParams();
-      params.url = url;
-      params.reader = reader;
-      _proxyImpl.sendMessage(params, _mediaFactoryMethodCreateNetworkReaderName);
-    }
-}
-
-
-class MediaFactoryProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  MediaFactory ptr;
-
-  MediaFactoryProxy(_MediaFactoryProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _MediaFactoryProxyCalls(proxyImpl);
-
+class MediaFactoryProxy extends bindings.Proxy
+                              implements MediaFactory {
   MediaFactoryProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _MediaFactoryProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _MediaFactoryProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _MediaFactoryProxyControl.fromEndpoint(endpoint));
 
-  MediaFactoryProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _MediaFactoryProxyImpl.fromHandle(handle) {
-    ptr = new _MediaFactoryProxyCalls(impl);
-  }
+  MediaFactoryProxy.fromHandle(core.MojoHandle handle)
+      : super(new _MediaFactoryProxyControl.fromHandle(handle));
 
-  MediaFactoryProxy.unbound() :
-      impl = new _MediaFactoryProxyImpl.unbound() {
-    ptr = new _MediaFactoryProxyCalls(impl);
+  MediaFactoryProxy.unbound()
+      : super(new _MediaFactoryProxyControl.unbound());
+
+  static MediaFactoryProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For MediaFactoryProxy"));
+    return new MediaFactoryProxy.fromEndpoint(endpoint);
   }
 
   factory MediaFactoryProxy.connectToService(
@@ -729,30 +653,74 @@
     return p;
   }
 
-  static MediaFactoryProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For MediaFactoryProxy"));
-    return new MediaFactoryProxy.fromEndpoint(endpoint);
+
+  void createPlayer(Object reader, Object player) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _MediaFactoryCreatePlayerParams();
+    params.reader = reader;
+    params.player = player;
+    ctrl.sendMessage(params,
+        _mediaFactoryMethodCreatePlayerName);
   }
-
-  String get serviceName => MediaFactory.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
+  void createSource(Object reader, List<media_types_mojom.MediaTypeSet> allowedMediaTypes, Object source) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _MediaFactoryCreateSourceParams();
+    params.reader = reader;
+    params.allowedMediaTypes = allowedMediaTypes;
+    params.source = source;
+    ctrl.sendMessage(params,
+        _mediaFactoryMethodCreateSourceName);
   }
-
-  String toString() {
-    return "MediaFactoryProxy($impl)";
+  void createSink(String destinationUrl, media_types_mojom.MediaType mediaType, Object sink) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _MediaFactoryCreateSinkParams();
+    params.destinationUrl = destinationUrl;
+    params.mediaType = mediaType;
+    params.sink = sink;
+    ctrl.sendMessage(params,
+        _mediaFactoryMethodCreateSinkName);
+  }
+  void createDemux(Object reader, Object demux) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _MediaFactoryCreateDemuxParams();
+    params.reader = reader;
+    params.demux = demux;
+    ctrl.sendMessage(params,
+        _mediaFactoryMethodCreateDemuxName);
+  }
+  void createDecoder(media_types_mojom.MediaType inputMediaType, Object decoder) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _MediaFactoryCreateDecoderParams();
+    params.inputMediaType = inputMediaType;
+    params.decoder = decoder;
+    ctrl.sendMessage(params,
+        _mediaFactoryMethodCreateDecoderName);
+  }
+  void createNetworkReader(String url, Object reader) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _MediaFactoryCreateNetworkReaderParams();
+    params.url = url;
+    params.reader = reader;
+    ctrl.sendMessage(params,
+        _mediaFactoryMethodCreateNetworkReaderName);
   }
 }
 
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 bcd6d91..e08166b 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
@@ -491,24 +491,22 @@
 }
 
 
-class _MediaPlayerProxyImpl extends bindings.Proxy {
-  _MediaPlayerProxyImpl.fromEndpoint(
+class _MediaPlayerProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _MediaPlayerProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _MediaPlayerProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _MediaPlayerProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _MediaPlayerProxyImpl.unbound() : super.unbound();
-
-  static _MediaPlayerProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _MediaPlayerProxyImpl"));
-    return new _MediaPlayerProxyImpl.fromEndpoint(endpoint);
-  }
+  _MediaPlayerProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _MediaPlayerServiceDescription();
+      new _MediaPlayerServiceDescription();
 
+  String get serviceName => MediaPlayer.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _mediaPlayerMethodGetStatusName:
@@ -538,76 +536,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_MediaPlayerProxyImpl($superString)";
+    return "_MediaPlayerProxyControl($superString)";
   }
 }
 
 
-class _MediaPlayerProxyCalls implements MediaPlayer {
-  _MediaPlayerProxyImpl _proxyImpl;
-
-  _MediaPlayerProxyCalls(this._proxyImpl);
-    void play() {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _MediaPlayerPlayParams();
-      _proxyImpl.sendMessage(params, _mediaPlayerMethodPlayName);
-    }
-    void pause() {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _MediaPlayerPauseParams();
-      _proxyImpl.sendMessage(params, _mediaPlayerMethodPauseName);
-    }
-    void seek(int position) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _MediaPlayerSeekParams();
-      params.position = position;
-      _proxyImpl.sendMessage(params, _mediaPlayerMethodSeekName);
-    }
-    dynamic getStatus(int versionLastSeen,[Function responseFactory = null]) {
-      var params = new _MediaPlayerGetStatusParams();
-      params.versionLastSeen = versionLastSeen;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _mediaPlayerMethodGetStatusName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-}
-
-
-class MediaPlayerProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  MediaPlayer ptr;
-
-  MediaPlayerProxy(_MediaPlayerProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _MediaPlayerProxyCalls(proxyImpl);
-
+class MediaPlayerProxy extends bindings.Proxy
+                              implements MediaPlayer {
   MediaPlayerProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _MediaPlayerProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _MediaPlayerProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _MediaPlayerProxyControl.fromEndpoint(endpoint));
 
-  MediaPlayerProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _MediaPlayerProxyImpl.fromHandle(handle) {
-    ptr = new _MediaPlayerProxyCalls(impl);
-  }
+  MediaPlayerProxy.fromHandle(core.MojoHandle handle)
+      : super(new _MediaPlayerProxyControl.fromHandle(handle));
 
-  MediaPlayerProxy.unbound() :
-      impl = new _MediaPlayerProxyImpl.unbound() {
-    ptr = new _MediaPlayerProxyCalls(impl);
+  MediaPlayerProxy.unbound()
+      : super(new _MediaPlayerProxyControl.unbound());
+
+  static MediaPlayerProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For MediaPlayerProxy"));
+    return new MediaPlayerProxy.fromEndpoint(endpoint);
   }
 
   factory MediaPlayerProxy.connectToService(
@@ -617,30 +569,43 @@
     return p;
   }
 
-  static MediaPlayerProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For MediaPlayerProxy"));
-    return new MediaPlayerProxy.fromEndpoint(endpoint);
+
+  void play() {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _MediaPlayerPlayParams();
+    ctrl.sendMessage(params,
+        _mediaPlayerMethodPlayName);
   }
-
-  String get serviceName => MediaPlayer.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
+  void pause() {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _MediaPlayerPauseParams();
+    ctrl.sendMessage(params,
+        _mediaPlayerMethodPauseName);
   }
-
-  String toString() {
-    return "MediaPlayerProxy($impl)";
+  void seek(int position) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _MediaPlayerSeekParams();
+    params.position = position;
+    ctrl.sendMessage(params,
+        _mediaPlayerMethodSeekName);
+  }
+  dynamic getStatus(int versionLastSeen,[Function responseFactory = null]) {
+    var params = new _MediaPlayerGetStatusParams();
+    params.versionLastSeen = versionLastSeen;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _mediaPlayerMethodGetStatusName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
 }
 
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 f398636..27cd180 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
@@ -475,24 +475,22 @@
 }
 
 
-class _MediaSinkProxyImpl extends bindings.Proxy {
-  _MediaSinkProxyImpl.fromEndpoint(
+class _MediaSinkProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _MediaSinkProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _MediaSinkProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _MediaSinkProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _MediaSinkProxyImpl.unbound() : super.unbound();
-
-  static _MediaSinkProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _MediaSinkProxyImpl"));
-    return new _MediaSinkProxyImpl.fromEndpoint(endpoint);
-  }
+  _MediaSinkProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _MediaSinkServiceDescription();
+      new _MediaSinkServiceDescription();
 
+  String get serviceName => MediaSink.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _mediaSinkMethodGetStatusName:
@@ -522,76 +520,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_MediaSinkProxyImpl($superString)";
+    return "_MediaSinkProxyControl($superString)";
   }
 }
 
 
-class _MediaSinkProxyCalls implements MediaSink {
-  _MediaSinkProxyImpl _proxyImpl;
-
-  _MediaSinkProxyCalls(this._proxyImpl);
-    void getConsumer(Object consumer) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _MediaSinkGetConsumerParams();
-      params.consumer = consumer;
-      _proxyImpl.sendMessage(params, _mediaSinkMethodGetConsumerName);
-    }
-    dynamic getStatus(int versionLastSeen,[Function responseFactory = null]) {
-      var params = new _MediaSinkGetStatusParams();
-      params.versionLastSeen = versionLastSeen;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _mediaSinkMethodGetStatusName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    void play() {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _MediaSinkPlayParams();
-      _proxyImpl.sendMessage(params, _mediaSinkMethodPlayName);
-    }
-    void pause() {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _MediaSinkPauseParams();
-      _proxyImpl.sendMessage(params, _mediaSinkMethodPauseName);
-    }
-}
-
-
-class MediaSinkProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  MediaSink ptr;
-
-  MediaSinkProxy(_MediaSinkProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _MediaSinkProxyCalls(proxyImpl);
-
+class MediaSinkProxy extends bindings.Proxy
+                              implements MediaSink {
   MediaSinkProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _MediaSinkProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _MediaSinkProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _MediaSinkProxyControl.fromEndpoint(endpoint));
 
-  MediaSinkProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _MediaSinkProxyImpl.fromHandle(handle) {
-    ptr = new _MediaSinkProxyCalls(impl);
-  }
+  MediaSinkProxy.fromHandle(core.MojoHandle handle)
+      : super(new _MediaSinkProxyControl.fromHandle(handle));
 
-  MediaSinkProxy.unbound() :
-      impl = new _MediaSinkProxyImpl.unbound() {
-    ptr = new _MediaSinkProxyCalls(impl);
+  MediaSinkProxy.unbound()
+      : super(new _MediaSinkProxyControl.unbound());
+
+  static MediaSinkProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For MediaSinkProxy"));
+    return new MediaSinkProxy.fromEndpoint(endpoint);
   }
 
   factory MediaSinkProxy.connectToService(
@@ -601,30 +553,43 @@
     return p;
   }
 
-  static MediaSinkProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For MediaSinkProxy"));
-    return new MediaSinkProxy.fromEndpoint(endpoint);
+
+  void getConsumer(Object consumer) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _MediaSinkGetConsumerParams();
+    params.consumer = consumer;
+    ctrl.sendMessage(params,
+        _mediaSinkMethodGetConsumerName);
   }
-
-  String get serviceName => MediaSink.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
+  dynamic getStatus(int versionLastSeen,[Function responseFactory = null]) {
+    var params = new _MediaSinkGetStatusParams();
+    params.versionLastSeen = versionLastSeen;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _mediaSinkMethodGetStatusName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
-
-  String toString() {
-    return "MediaSinkProxy($impl)";
+  void play() {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _MediaSinkPlayParams();
+    ctrl.sendMessage(params,
+        _mediaSinkMethodPlayName);
+  }
+  void pause() {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _MediaSinkPauseParams();
+    ctrl.sendMessage(params,
+        _mediaSinkMethodPauseName);
   }
 }
 
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 fafa88a..42f3664 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
@@ -1191,24 +1191,22 @@
 }
 
 
-class _MediaSourceProxyImpl extends bindings.Proxy {
-  _MediaSourceProxyImpl.fromEndpoint(
+class _MediaSourceProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _MediaSourceProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _MediaSourceProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _MediaSourceProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _MediaSourceProxyImpl.unbound() : super.unbound();
-
-  static _MediaSourceProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _MediaSourceProxyImpl"));
-    return new _MediaSourceProxyImpl.fromEndpoint(endpoint);
-  }
+  _MediaSourceProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _MediaSourceServiceDescription();
+      new _MediaSourceServiceDescription();
 
+  String get serviceName => MediaSource.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _mediaSourceMethodGetStreamsName:
@@ -1338,112 +1336,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_MediaSourceProxyImpl($superString)";
+    return "_MediaSourceProxyControl($superString)";
   }
 }
 
 
-class _MediaSourceProxyCalls implements MediaSource {
-  _MediaSourceProxyImpl _proxyImpl;
-
-  _MediaSourceProxyCalls(this._proxyImpl);
-    dynamic getStreams([Function responseFactory = null]) {
-      var params = new _MediaSourceGetStreamsParams();
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _mediaSourceMethodGetStreamsName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    void getProducer(int streamIndex, Object producer) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _MediaSourceGetProducerParams();
-      params.streamIndex = streamIndex;
-      params.producer = producer;
-      _proxyImpl.sendMessage(params, _mediaSourceMethodGetProducerName);
-    }
-    void getPullModeProducer(int streamIndex, Object producer) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _MediaSourceGetPullModeProducerParams();
-      params.streamIndex = streamIndex;
-      params.producer = producer;
-      _proxyImpl.sendMessage(params, _mediaSourceMethodGetPullModeProducerName);
-    }
-    dynamic getStatus(int versionLastSeen,[Function responseFactory = null]) {
-      var params = new _MediaSourceGetStatusParams();
-      params.versionLastSeen = versionLastSeen;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _mediaSourceMethodGetStatusName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    dynamic prepare([Function responseFactory = null]) {
-      var params = new _MediaSourcePrepareParams();
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _mediaSourceMethodPrepareName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    dynamic prime([Function responseFactory = null]) {
-      var params = new _MediaSourcePrimeParams();
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _mediaSourceMethodPrimeName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    dynamic flush([Function responseFactory = null]) {
-      var params = new _MediaSourceFlushParams();
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _mediaSourceMethodFlushName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    dynamic seek(int position,[Function responseFactory = null]) {
-      var params = new _MediaSourceSeekParams();
-      params.position = position;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _mediaSourceMethodSeekName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-}
-
-
-class MediaSourceProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  MediaSource ptr;
-
-  MediaSourceProxy(_MediaSourceProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _MediaSourceProxyCalls(proxyImpl);
-
+class MediaSourceProxy extends bindings.Proxy
+                              implements MediaSource {
   MediaSourceProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _MediaSourceProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _MediaSourceProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _MediaSourceProxyControl.fromEndpoint(endpoint));
 
-  MediaSourceProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _MediaSourceProxyImpl.fromHandle(handle) {
-    ptr = new _MediaSourceProxyCalls(impl);
-  }
+  MediaSourceProxy.fromHandle(core.MojoHandle handle)
+      : super(new _MediaSourceProxyControl.fromHandle(handle));
 
-  MediaSourceProxy.unbound() :
-      impl = new _MediaSourceProxyImpl.unbound() {
-    ptr = new _MediaSourceProxyCalls(impl);
+  MediaSourceProxy.unbound()
+      : super(new _MediaSourceProxyControl.unbound());
+
+  static MediaSourceProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For MediaSourceProxy"));
+    return new MediaSourceProxy.fromEndpoint(endpoint);
   }
 
   factory MediaSourceProxy.connectToService(
@@ -1453,30 +1369,78 @@
     return p;
   }
 
-  static MediaSourceProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For MediaSourceProxy"));
-    return new MediaSourceProxy.fromEndpoint(endpoint);
+
+  dynamic getStreams([Function responseFactory = null]) {
+    var params = new _MediaSourceGetStreamsParams();
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _mediaSourceMethodGetStreamsName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
-
-  String get serviceName => MediaSource.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
+  void getProducer(int streamIndex, Object producer) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _MediaSourceGetProducerParams();
+    params.streamIndex = streamIndex;
+    params.producer = producer;
+    ctrl.sendMessage(params,
+        _mediaSourceMethodGetProducerName);
   }
-
-  String toString() {
-    return "MediaSourceProxy($impl)";
+  void getPullModeProducer(int streamIndex, Object producer) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _MediaSourceGetPullModeProducerParams();
+    params.streamIndex = streamIndex;
+    params.producer = producer;
+    ctrl.sendMessage(params,
+        _mediaSourceMethodGetPullModeProducerName);
+  }
+  dynamic getStatus(int versionLastSeen,[Function responseFactory = null]) {
+    var params = new _MediaSourceGetStatusParams();
+    params.versionLastSeen = versionLastSeen;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _mediaSourceMethodGetStatusName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
+  }
+  dynamic prepare([Function responseFactory = null]) {
+    var params = new _MediaSourcePrepareParams();
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _mediaSourceMethodPrepareName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
+  }
+  dynamic prime([Function responseFactory = null]) {
+    var params = new _MediaSourcePrimeParams();
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _mediaSourceMethodPrimeName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
+  }
+  dynamic flush([Function responseFactory = null]) {
+    var params = new _MediaSourceFlushParams();
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _mediaSourceMethodFlushName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
+  }
+  dynamic seek(int position,[Function responseFactory = null]) {
+    var params = new _MediaSourceSeekParams();
+    params.position = position;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _mediaSourceMethodSeekName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
 }
 
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 176f176..40d90f9 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
@@ -1295,24 +1295,22 @@
 }
 
 
-class _MediaProducerProxyImpl extends bindings.Proxy {
-  _MediaProducerProxyImpl.fromEndpoint(
+class _MediaProducerProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _MediaProducerProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _MediaProducerProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _MediaProducerProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _MediaProducerProxyImpl.unbound() : super.unbound();
-
-  static _MediaProducerProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _MediaProducerProxyImpl"));
-    return new _MediaProducerProxyImpl.fromEndpoint(endpoint);
-  }
+  _MediaProducerProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _MediaProducerServiceDescription();
+      new _MediaProducerServiceDescription();
 
+  String get serviceName => MediaProducer.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _mediaProducerMethodConnectName:
@@ -1342,59 +1340,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_MediaProducerProxyImpl($superString)";
+    return "_MediaProducerProxyControl($superString)";
   }
 }
 
 
-class _MediaProducerProxyCalls implements MediaProducer {
-  _MediaProducerProxyImpl _proxyImpl;
-
-  _MediaProducerProxyCalls(this._proxyImpl);
-    dynamic connect(Object consumer,[Function responseFactory = null]) {
-      var params = new _MediaProducerConnectParams();
-      params.consumer = consumer;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _mediaProducerMethodConnectName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    void disconnect() {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _MediaProducerDisconnectParams();
-      _proxyImpl.sendMessage(params, _mediaProducerMethodDisconnectName);
-    }
-}
-
-
-class MediaProducerProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  MediaProducer ptr;
-
-  MediaProducerProxy(_MediaProducerProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _MediaProducerProxyCalls(proxyImpl);
-
+class MediaProducerProxy extends bindings.Proxy
+                              implements MediaProducer {
   MediaProducerProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _MediaProducerProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _MediaProducerProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _MediaProducerProxyControl.fromEndpoint(endpoint));
 
-  MediaProducerProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _MediaProducerProxyImpl.fromHandle(handle) {
-    ptr = new _MediaProducerProxyCalls(impl);
-  }
+  MediaProducerProxy.fromHandle(core.MojoHandle handle)
+      : super(new _MediaProducerProxyControl.fromHandle(handle));
 
-  MediaProducerProxy.unbound() :
-      impl = new _MediaProducerProxyImpl.unbound() {
-    ptr = new _MediaProducerProxyCalls(impl);
+  MediaProducerProxy.unbound()
+      : super(new _MediaProducerProxyControl.unbound());
+
+  static MediaProducerProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For MediaProducerProxy"));
+    return new MediaProducerProxy.fromEndpoint(endpoint);
   }
 
   factory MediaProducerProxy.connectToService(
@@ -1404,30 +1373,24 @@
     return p;
   }
 
-  static MediaProducerProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For MediaProducerProxy"));
-    return new MediaProducerProxy.fromEndpoint(endpoint);
+
+  dynamic connect(Object consumer,[Function responseFactory = null]) {
+    var params = new _MediaProducerConnectParams();
+    params.consumer = consumer;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _mediaProducerMethodConnectName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
-
-  String get serviceName => MediaProducer.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "MediaProducerProxy($impl)";
+  void disconnect() {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _MediaProducerDisconnectParams();
+    ctrl.sendMessage(params,
+        _mediaProducerMethodDisconnectName);
   }
 }
 
@@ -1561,24 +1524,22 @@
 }
 
 
-class _MediaPullModeProducerProxyImpl extends bindings.Proxy {
-  _MediaPullModeProducerProxyImpl.fromEndpoint(
+class _MediaPullModeProducerProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _MediaPullModeProducerProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _MediaPullModeProducerProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _MediaPullModeProducerProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _MediaPullModeProducerProxyImpl.unbound() : super.unbound();
-
-  static _MediaPullModeProducerProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _MediaPullModeProducerProxyImpl"));
-    return new _MediaPullModeProducerProxyImpl.fromEndpoint(endpoint);
-  }
+  _MediaPullModeProducerProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _MediaPullModeProducerServiceDescription();
+      new _MediaPullModeProducerServiceDescription();
 
+  String get serviceName => MediaPullModeProducer.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _mediaPullModeProducerMethodGetBufferName:
@@ -1628,68 +1589,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_MediaPullModeProducerProxyImpl($superString)";
+    return "_MediaPullModeProducerProxyControl($superString)";
   }
 }
 
 
-class _MediaPullModeProducerProxyCalls implements MediaPullModeProducer {
-  _MediaPullModeProducerProxyImpl _proxyImpl;
-
-  _MediaPullModeProducerProxyCalls(this._proxyImpl);
-    dynamic getBuffer([Function responseFactory = null]) {
-      var params = new _MediaPullModeProducerGetBufferParams();
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _mediaPullModeProducerMethodGetBufferName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    dynamic pullPacket(MediaPacket toRelease,[Function responseFactory = null]) {
-      var params = new _MediaPullModeProducerPullPacketParams();
-      params.toRelease = toRelease;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _mediaPullModeProducerMethodPullPacketName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    void releasePacket(MediaPacket toRelease) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _MediaPullModeProducerReleasePacketParams();
-      params.toRelease = toRelease;
-      _proxyImpl.sendMessage(params, _mediaPullModeProducerMethodReleasePacketName);
-    }
-}
-
-
-class MediaPullModeProducerProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  MediaPullModeProducer ptr;
-
-  MediaPullModeProducerProxy(_MediaPullModeProducerProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _MediaPullModeProducerProxyCalls(proxyImpl);
-
+class MediaPullModeProducerProxy extends bindings.Proxy
+                              implements MediaPullModeProducer {
   MediaPullModeProducerProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _MediaPullModeProducerProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _MediaPullModeProducerProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _MediaPullModeProducerProxyControl.fromEndpoint(endpoint));
 
-  MediaPullModeProducerProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _MediaPullModeProducerProxyImpl.fromHandle(handle) {
-    ptr = new _MediaPullModeProducerProxyCalls(impl);
-  }
+  MediaPullModeProducerProxy.fromHandle(core.MojoHandle handle)
+      : super(new _MediaPullModeProducerProxyControl.fromHandle(handle));
 
-  MediaPullModeProducerProxy.unbound() :
-      impl = new _MediaPullModeProducerProxyImpl.unbound() {
-    ptr = new _MediaPullModeProducerProxyCalls(impl);
+  MediaPullModeProducerProxy.unbound()
+      : super(new _MediaPullModeProducerProxyControl.unbound());
+
+  static MediaPullModeProducerProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For MediaPullModeProducerProxy"));
+    return new MediaPullModeProducerProxy.fromEndpoint(endpoint);
   }
 
   factory MediaPullModeProducerProxy.connectToService(
@@ -1699,30 +1622,33 @@
     return p;
   }
 
-  static MediaPullModeProducerProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For MediaPullModeProducerProxy"));
-    return new MediaPullModeProducerProxy.fromEndpoint(endpoint);
+
+  dynamic getBuffer([Function responseFactory = null]) {
+    var params = new _MediaPullModeProducerGetBufferParams();
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _mediaPullModeProducerMethodGetBufferName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
-
-  String get serviceName => MediaPullModeProducer.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
+  dynamic pullPacket(MediaPacket toRelease,[Function responseFactory = null]) {
+    var params = new _MediaPullModeProducerPullPacketParams();
+    params.toRelease = toRelease;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _mediaPullModeProducerMethodPullPacketName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
-
-  String toString() {
-    return "MediaPullModeProducerProxy($impl)";
+  void releasePacket(MediaPacket toRelease) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _MediaPullModeProducerReleasePacketParams();
+    params.toRelease = toRelease;
+    ctrl.sendMessage(params,
+        _mediaPullModeProducerMethodReleasePacketName);
   }
 }
 
@@ -1939,24 +1865,22 @@
 }
 
 
-class _MediaConsumerProxyImpl extends bindings.Proxy {
-  _MediaConsumerProxyImpl.fromEndpoint(
+class _MediaConsumerProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _MediaConsumerProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _MediaConsumerProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _MediaConsumerProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _MediaConsumerProxyImpl.unbound() : super.unbound();
-
-  static _MediaConsumerProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _MediaConsumerProxyImpl"));
-    return new _MediaConsumerProxyImpl.fromEndpoint(endpoint);
-  }
+  _MediaConsumerProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _MediaConsumerServiceDescription();
+      new _MediaConsumerServiceDescription();
 
+  String get serviceName => MediaConsumer.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _mediaConsumerMethodSetBufferName:
@@ -2046,76 +1970,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_MediaConsumerProxyImpl($superString)";
+    return "_MediaConsumerProxyControl($superString)";
   }
 }
 
 
-class _MediaConsumerProxyCalls implements MediaConsumer {
-  _MediaConsumerProxyImpl _proxyImpl;
-
-  _MediaConsumerProxyCalls(this._proxyImpl);
-    dynamic setBuffer(core.MojoSharedBuffer buffer,[Function responseFactory = null]) {
-      var params = new _MediaConsumerSetBufferParams();
-      params.buffer = buffer;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _mediaConsumerMethodSetBufferName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    dynamic sendPacket(MediaPacket packet,[Function responseFactory = null]) {
-      var params = new _MediaConsumerSendPacketParams();
-      params.packet = packet;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _mediaConsumerMethodSendPacketName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    dynamic prime([Function responseFactory = null]) {
-      var params = new _MediaConsumerPrimeParams();
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _mediaConsumerMethodPrimeName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    dynamic flush([Function responseFactory = null]) {
-      var params = new _MediaConsumerFlushParams();
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _mediaConsumerMethodFlushName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-}
-
-
-class MediaConsumerProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  MediaConsumer ptr;
-
-  MediaConsumerProxy(_MediaConsumerProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _MediaConsumerProxyCalls(proxyImpl);
-
+class MediaConsumerProxy extends bindings.Proxy
+                              implements MediaConsumer {
   MediaConsumerProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _MediaConsumerProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _MediaConsumerProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _MediaConsumerProxyControl.fromEndpoint(endpoint));
 
-  MediaConsumerProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _MediaConsumerProxyImpl.fromHandle(handle) {
-    ptr = new _MediaConsumerProxyCalls(impl);
-  }
+  MediaConsumerProxy.fromHandle(core.MojoHandle handle)
+      : super(new _MediaConsumerProxyControl.fromHandle(handle));
 
-  MediaConsumerProxy.unbound() :
-      impl = new _MediaConsumerProxyImpl.unbound() {
-    ptr = new _MediaConsumerProxyCalls(impl);
+  MediaConsumerProxy.unbound()
+      : super(new _MediaConsumerProxyControl.unbound());
+
+  static MediaConsumerProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For MediaConsumerProxy"));
+    return new MediaConsumerProxy.fromEndpoint(endpoint);
   }
 
   factory MediaConsumerProxy.connectToService(
@@ -2125,30 +2003,40 @@
     return p;
   }
 
-  static MediaConsumerProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For MediaConsumerProxy"));
-    return new MediaConsumerProxy.fromEndpoint(endpoint);
+
+  dynamic setBuffer(core.MojoSharedBuffer buffer,[Function responseFactory = null]) {
+    var params = new _MediaConsumerSetBufferParams();
+    params.buffer = buffer;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _mediaConsumerMethodSetBufferName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
-
-  String get serviceName => MediaConsumer.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
+  dynamic sendPacket(MediaPacket packet,[Function responseFactory = null]) {
+    var params = new _MediaConsumerSendPacketParams();
+    params.packet = packet;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _mediaConsumerMethodSendPacketName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
-
-  String toString() {
-    return "MediaConsumerProxy($impl)";
+  dynamic prime([Function responseFactory = null]) {
+    var params = new _MediaConsumerPrimeParams();
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _mediaConsumerMethodPrimeName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
+  }
+  dynamic flush([Function responseFactory = null]) {
+    var params = new _MediaConsumerFlushParams();
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _mediaConsumerMethodFlushName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
 }
 
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 8e8a5c6..45ff36f 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
@@ -307,24 +307,22 @@
 }
 
 
-class _MediaTypeConverterProxyImpl extends bindings.Proxy {
-  _MediaTypeConverterProxyImpl.fromEndpoint(
+class _MediaTypeConverterProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _MediaTypeConverterProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _MediaTypeConverterProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _MediaTypeConverterProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _MediaTypeConverterProxyImpl.unbound() : super.unbound();
-
-  static _MediaTypeConverterProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _MediaTypeConverterProxyImpl"));
-    return new _MediaTypeConverterProxyImpl.fromEndpoint(endpoint);
-  }
+  _MediaTypeConverterProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _MediaTypeConverterServiceDescription();
+      new _MediaTypeConverterServiceDescription();
 
+  String get serviceName => MediaTypeConverter.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _mediaTypeConverterMethodGetOutputTypeName:
@@ -354,68 +352,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_MediaTypeConverterProxyImpl($superString)";
+    return "_MediaTypeConverterProxyControl($superString)";
   }
 }
 
 
-class _MediaTypeConverterProxyCalls implements MediaTypeConverter {
-  _MediaTypeConverterProxyImpl _proxyImpl;
-
-  _MediaTypeConverterProxyCalls(this._proxyImpl);
-    dynamic getOutputType([Function responseFactory = null]) {
-      var params = new _MediaTypeConverterGetOutputTypeParams();
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _mediaTypeConverterMethodGetOutputTypeName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    void getConsumer(Object consumer) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _MediaTypeConverterGetConsumerParams();
-      params.consumer = consumer;
-      _proxyImpl.sendMessage(params, _mediaTypeConverterMethodGetConsumerName);
-    }
-    void getProducer(Object producer) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _MediaTypeConverterGetProducerParams();
-      params.producer = producer;
-      _proxyImpl.sendMessage(params, _mediaTypeConverterMethodGetProducerName);
-    }
-}
-
-
-class MediaTypeConverterProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  MediaTypeConverter ptr;
-
-  MediaTypeConverterProxy(_MediaTypeConverterProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _MediaTypeConverterProxyCalls(proxyImpl);
-
+class MediaTypeConverterProxy extends bindings.Proxy
+                              implements MediaTypeConverter {
   MediaTypeConverterProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _MediaTypeConverterProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _MediaTypeConverterProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _MediaTypeConverterProxyControl.fromEndpoint(endpoint));
 
-  MediaTypeConverterProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _MediaTypeConverterProxyImpl.fromHandle(handle) {
-    ptr = new _MediaTypeConverterProxyCalls(impl);
-  }
+  MediaTypeConverterProxy.fromHandle(core.MojoHandle handle)
+      : super(new _MediaTypeConverterProxyControl.fromHandle(handle));
 
-  MediaTypeConverterProxy.unbound() :
-      impl = new _MediaTypeConverterProxyImpl.unbound() {
-    ptr = new _MediaTypeConverterProxyCalls(impl);
+  MediaTypeConverterProxy.unbound()
+      : super(new _MediaTypeConverterProxyControl.unbound());
+
+  static MediaTypeConverterProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For MediaTypeConverterProxy"));
+    return new MediaTypeConverterProxy.fromEndpoint(endpoint);
   }
 
   factory MediaTypeConverterProxy.connectToService(
@@ -425,30 +385,34 @@
     return p;
   }
 
-  static MediaTypeConverterProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For MediaTypeConverterProxy"));
-    return new MediaTypeConverterProxy.fromEndpoint(endpoint);
+
+  dynamic getOutputType([Function responseFactory = null]) {
+    var params = new _MediaTypeConverterGetOutputTypeParams();
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _mediaTypeConverterMethodGetOutputTypeName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
-
-  String get serviceName => MediaTypeConverter.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
+  void getConsumer(Object consumer) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _MediaTypeConverterGetConsumerParams();
+    params.consumer = consumer;
+    ctrl.sendMessage(params,
+        _mediaTypeConverterMethodGetConsumerName);
   }
-
-  String toString() {
-    return "MediaTypeConverterProxy($impl)";
+  void getProducer(Object producer) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _MediaTypeConverterGetProducerParams();
+    params.producer = producer;
+    ctrl.sendMessage(params,
+        _mediaTypeConverterMethodGetProducerName);
   }
 }
 
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 7c0f41e..283e0d6 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
@@ -877,24 +877,22 @@
 }
 
 
-class _RateControlProxyImpl extends bindings.Proxy {
-  _RateControlProxyImpl.fromEndpoint(
+class _RateControlProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _RateControlProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _RateControlProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _RateControlProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _RateControlProxyImpl.unbound() : super.unbound();
-
-  static _RateControlProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _RateControlProxyImpl"));
-    return new _RateControlProxyImpl.fromEndpoint(endpoint);
-  }
+  _RateControlProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _RateControlServiceDescription();
+      new _RateControlServiceDescription();
 
+  String get serviceName => RateControl.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _rateControlMethodGetCurrentTransformName:
@@ -924,108 +922,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_RateControlProxyImpl($superString)";
+    return "_RateControlProxyControl($superString)";
   }
 }
 
 
-class _RateControlProxyCalls implements RateControl {
-  _RateControlProxyImpl _proxyImpl;
-
-  _RateControlProxyCalls(this._proxyImpl);
-    dynamic getCurrentTransform([Function responseFactory = null]) {
-      var params = new _RateControlGetCurrentTransformParams();
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _rateControlMethodGetCurrentTransformName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    void setCurrentQuad(TimelineQuad quad) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _RateControlSetCurrentQuadParams();
-      params.quad = quad;
-      _proxyImpl.sendMessage(params, _rateControlMethodSetCurrentQuadName);
-    }
-    void setTargetTimelineId(int id) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _RateControlSetTargetTimelineIdParams();
-      params.id = id;
-      _proxyImpl.sendMessage(params, _rateControlMethodSetTargetTimelineIdName);
-    }
-    void setRate(int referenceDelta, int targetDelta) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _RateControlSetRateParams();
-      params.referenceDelta = referenceDelta;
-      params.targetDelta = targetDelta;
-      _proxyImpl.sendMessage(params, _rateControlMethodSetRateName);
-    }
-    void setRateAtReferenceTime(int referenceDelta, int targetDelta, int referenceTime) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _RateControlSetRateAtReferenceTimeParams();
-      params.referenceDelta = referenceDelta;
-      params.targetDelta = targetDelta;
-      params.referenceTime = referenceTime;
-      _proxyImpl.sendMessage(params, _rateControlMethodSetRateAtReferenceTimeName);
-    }
-    void setRateAtTargetTime(int referenceDelta, int targetDelta, int targetTime) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _RateControlSetRateAtTargetTimeParams();
-      params.referenceDelta = referenceDelta;
-      params.targetDelta = targetDelta;
-      params.targetTime = targetTime;
-      _proxyImpl.sendMessage(params, _rateControlMethodSetRateAtTargetTimeName);
-    }
-    void cancelPendingChanges() {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _RateControlCancelPendingChangesParams();
-      _proxyImpl.sendMessage(params, _rateControlMethodCancelPendingChangesName);
-    }
-}
-
-
-class RateControlProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  RateControl ptr;
-
-  RateControlProxy(_RateControlProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _RateControlProxyCalls(proxyImpl);
-
+class RateControlProxy extends bindings.Proxy
+                              implements RateControl {
   RateControlProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _RateControlProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _RateControlProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _RateControlProxyControl.fromEndpoint(endpoint));
 
-  RateControlProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _RateControlProxyImpl.fromHandle(handle) {
-    ptr = new _RateControlProxyCalls(impl);
-  }
+  RateControlProxy.fromHandle(core.MojoHandle handle)
+      : super(new _RateControlProxyControl.fromHandle(handle));
 
-  RateControlProxy.unbound() :
-      impl = new _RateControlProxyImpl.unbound() {
-    ptr = new _RateControlProxyCalls(impl);
+  RateControlProxy.unbound()
+      : super(new _RateControlProxyControl.unbound());
+
+  static RateControlProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For RateControlProxy"));
+    return new RateControlProxy.fromEndpoint(endpoint);
   }
 
   factory RateControlProxy.connectToService(
@@ -1035,30 +955,78 @@
     return p;
   }
 
-  static RateControlProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For RateControlProxy"));
-    return new RateControlProxy.fromEndpoint(endpoint);
+
+  dynamic getCurrentTransform([Function responseFactory = null]) {
+    var params = new _RateControlGetCurrentTransformParams();
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _rateControlMethodGetCurrentTransformName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
-
-  String get serviceName => RateControl.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
+  void setCurrentQuad(TimelineQuad quad) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _RateControlSetCurrentQuadParams();
+    params.quad = quad;
+    ctrl.sendMessage(params,
+        _rateControlMethodSetCurrentQuadName);
   }
-
-  String toString() {
-    return "RateControlProxy($impl)";
+  void setTargetTimelineId(int id) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _RateControlSetTargetTimelineIdParams();
+    params.id = id;
+    ctrl.sendMessage(params,
+        _rateControlMethodSetTargetTimelineIdName);
+  }
+  void setRate(int referenceDelta, int targetDelta) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _RateControlSetRateParams();
+    params.referenceDelta = referenceDelta;
+    params.targetDelta = targetDelta;
+    ctrl.sendMessage(params,
+        _rateControlMethodSetRateName);
+  }
+  void setRateAtReferenceTime(int referenceDelta, int targetDelta, int referenceTime) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _RateControlSetRateAtReferenceTimeParams();
+    params.referenceDelta = referenceDelta;
+    params.targetDelta = targetDelta;
+    params.referenceTime = referenceTime;
+    ctrl.sendMessage(params,
+        _rateControlMethodSetRateAtReferenceTimeName);
+  }
+  void setRateAtTargetTime(int referenceDelta, int targetDelta, int targetTime) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _RateControlSetRateAtTargetTimeParams();
+    params.referenceDelta = referenceDelta;
+    params.targetDelta = targetDelta;
+    params.targetTime = targetTime;
+    ctrl.sendMessage(params,
+        _rateControlMethodSetRateAtTargetTimeName);
+  }
+  void cancelPendingChanges() {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _RateControlCancelPendingChangesParams();
+    ctrl.sendMessage(params,
+        _rateControlMethodCancelPendingChangesName);
   }
 }
 
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 f9bcca9..ab156dd 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
@@ -354,24 +354,22 @@
 }
 
 
-class _SeekingReaderProxyImpl extends bindings.Proxy {
-  _SeekingReaderProxyImpl.fromEndpoint(
+class _SeekingReaderProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _SeekingReaderProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _SeekingReaderProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _SeekingReaderProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _SeekingReaderProxyImpl.unbound() : super.unbound();
-
-  static _SeekingReaderProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _SeekingReaderProxyImpl"));
-    return new _SeekingReaderProxyImpl.fromEndpoint(endpoint);
-  }
+  _SeekingReaderProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _SeekingReaderServiceDescription();
+      new _SeekingReaderServiceDescription();
 
+  String get serviceName => SeekingReader.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _seekingReaderMethodDescribeName:
@@ -421,59 +419,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_SeekingReaderProxyImpl($superString)";
+    return "_SeekingReaderProxyControl($superString)";
   }
 }
 
 
-class _SeekingReaderProxyCalls implements SeekingReader {
-  _SeekingReaderProxyImpl _proxyImpl;
-
-  _SeekingReaderProxyCalls(this._proxyImpl);
-    dynamic describe([Function responseFactory = null]) {
-      var params = new _SeekingReaderDescribeParams();
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _seekingReaderMethodDescribeName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    dynamic readAt(int position,[Function responseFactory = null]) {
-      var params = new _SeekingReaderReadAtParams();
-      params.position = position;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _seekingReaderMethodReadAtName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-}
-
-
-class SeekingReaderProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  SeekingReader ptr;
-
-  SeekingReaderProxy(_SeekingReaderProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _SeekingReaderProxyCalls(proxyImpl);
-
+class SeekingReaderProxy extends bindings.Proxy
+                              implements SeekingReader {
   SeekingReaderProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _SeekingReaderProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _SeekingReaderProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _SeekingReaderProxyControl.fromEndpoint(endpoint));
 
-  SeekingReaderProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _SeekingReaderProxyImpl.fromHandle(handle) {
-    ptr = new _SeekingReaderProxyCalls(impl);
-  }
+  SeekingReaderProxy.fromHandle(core.MojoHandle handle)
+      : super(new _SeekingReaderProxyControl.fromHandle(handle));
 
-  SeekingReaderProxy.unbound() :
-      impl = new _SeekingReaderProxyImpl.unbound() {
-    ptr = new _SeekingReaderProxyCalls(impl);
+  SeekingReaderProxy.unbound()
+      : super(new _SeekingReaderProxyControl.unbound());
+
+  static SeekingReaderProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For SeekingReaderProxy"));
+    return new SeekingReaderProxy.fromEndpoint(endpoint);
   }
 
   factory SeekingReaderProxy.connectToService(
@@ -483,30 +452,23 @@
     return p;
   }
 
-  static SeekingReaderProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For SeekingReaderProxy"));
-    return new SeekingReaderProxy.fromEndpoint(endpoint);
+
+  dynamic describe([Function responseFactory = null]) {
+    var params = new _SeekingReaderDescribeParams();
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _seekingReaderMethodDescribeName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
-
-  String get serviceName => SeekingReader.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "SeekingReaderProxy($impl)";
+  dynamic readAt(int position,[Function responseFactory = null]) {
+    var params = new _SeekingReaderReadAtParams();
+    params.position = position;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _seekingReaderMethodReadAtName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
 }
 
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 cd7ddc8..efdf793 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
@@ -941,24 +941,22 @@
 }
 
 
-class _MediaTimelineControllerProxyImpl extends bindings.Proxy {
-  _MediaTimelineControllerProxyImpl.fromEndpoint(
+class _MediaTimelineControllerProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _MediaTimelineControllerProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _MediaTimelineControllerProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _MediaTimelineControllerProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _MediaTimelineControllerProxyImpl.unbound() : super.unbound();
-
-  static _MediaTimelineControllerProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _MediaTimelineControllerProxyImpl"));
-    return new _MediaTimelineControllerProxyImpl.fromEndpoint(endpoint);
-  }
+  _MediaTimelineControllerProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _MediaTimelineControllerServiceDescription();
+      new _MediaTimelineControllerServiceDescription();
 
+  String get serviceName => MediaTimelineController.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _mediaTimelineControllerMethodGetStatusName:
@@ -1008,82 +1006,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_MediaTimelineControllerProxyImpl($superString)";
+    return "_MediaTimelineControllerProxyControl($superString)";
   }
 }
 
 
-class _MediaTimelineControllerProxyCalls implements MediaTimelineController {
-  _MediaTimelineControllerProxyImpl _proxyImpl;
-
-  _MediaTimelineControllerProxyCalls(this._proxyImpl);
-    void addControlSite(Object controlSite) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _MediaTimelineControllerAddControlSiteParams();
-      params.controlSite = controlSite;
-      _proxyImpl.sendMessage(params, _mediaTimelineControllerMethodAddControlSiteName);
-    }
-    dynamic getStatus(int versionLastSeen,[Function responseFactory = null]) {
-      var params = new _MediaTimelineControllerGetStatusParams();
-      params.versionLastSeen = versionLastSeen;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _mediaTimelineControllerMethodGetStatusName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    dynamic setTimelineTransform(int subjectTime,int subjectDelta,int referenceDelta,int effectiveSubjectTime,int effectiveReferenceTime,[Function responseFactory = null]) {
-      var params = new _MediaTimelineControllerSetTimelineTransformParams();
-      params.subjectTime = subjectTime;
-      params.subjectDelta = subjectDelta;
-      params.referenceDelta = referenceDelta;
-      params.effectiveSubjectTime = effectiveSubjectTime;
-      params.effectiveReferenceTime = effectiveReferenceTime;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _mediaTimelineControllerMethodSetTimelineTransformName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    void getControlSite(Object controlSite) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _MediaTimelineControllerGetControlSiteParams();
-      params.controlSite = controlSite;
-      _proxyImpl.sendMessage(params, _mediaTimelineControllerMethodGetControlSiteName);
-    }
-}
-
-
-class MediaTimelineControllerProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  MediaTimelineController ptr;
-
-  MediaTimelineControllerProxy(_MediaTimelineControllerProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _MediaTimelineControllerProxyCalls(proxyImpl);
-
+class MediaTimelineControllerProxy extends bindings.Proxy
+                              implements MediaTimelineController {
   MediaTimelineControllerProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _MediaTimelineControllerProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _MediaTimelineControllerProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _MediaTimelineControllerProxyControl.fromEndpoint(endpoint));
 
-  MediaTimelineControllerProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _MediaTimelineControllerProxyImpl.fromHandle(handle) {
-    ptr = new _MediaTimelineControllerProxyCalls(impl);
-  }
+  MediaTimelineControllerProxy.fromHandle(core.MojoHandle handle)
+      : super(new _MediaTimelineControllerProxyControl.fromHandle(handle));
 
-  MediaTimelineControllerProxy.unbound() :
-      impl = new _MediaTimelineControllerProxyImpl.unbound() {
-    ptr = new _MediaTimelineControllerProxyCalls(impl);
+  MediaTimelineControllerProxy.unbound()
+      : super(new _MediaTimelineControllerProxyControl.unbound());
+
+  static MediaTimelineControllerProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For MediaTimelineControllerProxy"));
+    return new MediaTimelineControllerProxy.fromEndpoint(endpoint);
   }
 
   factory MediaTimelineControllerProxy.connectToService(
@@ -1093,30 +1039,48 @@
     return p;
   }
 
-  static MediaTimelineControllerProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For MediaTimelineControllerProxy"));
-    return new MediaTimelineControllerProxy.fromEndpoint(endpoint);
+
+  void addControlSite(Object controlSite) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _MediaTimelineControllerAddControlSiteParams();
+    params.controlSite = controlSite;
+    ctrl.sendMessage(params,
+        _mediaTimelineControllerMethodAddControlSiteName);
   }
-
-  String get serviceName => MediaTimelineController.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
+  dynamic getStatus(int versionLastSeen,[Function responseFactory = null]) {
+    var params = new _MediaTimelineControllerGetStatusParams();
+    params.versionLastSeen = versionLastSeen;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _mediaTimelineControllerMethodGetStatusName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
-
-  String toString() {
-    return "MediaTimelineControllerProxy($impl)";
+  dynamic setTimelineTransform(int subjectTime,int subjectDelta,int referenceDelta,int effectiveSubjectTime,int effectiveReferenceTime,[Function responseFactory = null]) {
+    var params = new _MediaTimelineControllerSetTimelineTransformParams();
+    params.subjectTime = subjectTime;
+    params.subjectDelta = subjectDelta;
+    params.referenceDelta = referenceDelta;
+    params.effectiveSubjectTime = effectiveSubjectTime;
+    params.effectiveReferenceTime = effectiveReferenceTime;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _mediaTimelineControllerMethodSetTimelineTransformName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
+  }
+  void getControlSite(Object controlSite) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _MediaTimelineControllerGetControlSiteParams();
+    params.controlSite = controlSite;
+    ctrl.sendMessage(params,
+        _mediaTimelineControllerMethodGetControlSiteName);
   }
 }
 
@@ -1285,24 +1249,22 @@
 }
 
 
-class _MediaTimelineControlSiteProxyImpl extends bindings.Proxy {
-  _MediaTimelineControlSiteProxyImpl.fromEndpoint(
+class _MediaTimelineControlSiteProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _MediaTimelineControlSiteProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _MediaTimelineControlSiteProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _MediaTimelineControlSiteProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _MediaTimelineControlSiteProxyImpl.unbound() : super.unbound();
-
-  static _MediaTimelineControlSiteProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _MediaTimelineControlSiteProxyImpl"));
-    return new _MediaTimelineControlSiteProxyImpl.fromEndpoint(endpoint);
-  }
+  _MediaTimelineControlSiteProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _MediaTimelineControlSiteServiceDescription();
+      new _MediaTimelineControlSiteServiceDescription();
 
+  String get serviceName => MediaTimelineControlSite.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _mediaTimelineControlSiteMethodGetStatusName:
@@ -1332,60 +1294,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_MediaTimelineControlSiteProxyImpl($superString)";
+    return "_MediaTimelineControlSiteProxyControl($superString)";
   }
 }
 
 
-class _MediaTimelineControlSiteProxyCalls implements MediaTimelineControlSite {
-  _MediaTimelineControlSiteProxyImpl _proxyImpl;
-
-  _MediaTimelineControlSiteProxyCalls(this._proxyImpl);
-    dynamic getStatus(int versionLastSeen,[Function responseFactory = null]) {
-      var params = new _MediaTimelineControlSiteGetStatusParams();
-      params.versionLastSeen = versionLastSeen;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _mediaTimelineControlSiteMethodGetStatusName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    void getTimelineConsumer(Object timelineConsumer) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _MediaTimelineControlSiteGetTimelineConsumerParams();
-      params.timelineConsumer = timelineConsumer;
-      _proxyImpl.sendMessage(params, _mediaTimelineControlSiteMethodGetTimelineConsumerName);
-    }
-}
-
-
-class MediaTimelineControlSiteProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  MediaTimelineControlSite ptr;
-
-  MediaTimelineControlSiteProxy(_MediaTimelineControlSiteProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _MediaTimelineControlSiteProxyCalls(proxyImpl);
-
+class MediaTimelineControlSiteProxy extends bindings.Proxy
+                              implements MediaTimelineControlSite {
   MediaTimelineControlSiteProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _MediaTimelineControlSiteProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _MediaTimelineControlSiteProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _MediaTimelineControlSiteProxyControl.fromEndpoint(endpoint));
 
-  MediaTimelineControlSiteProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _MediaTimelineControlSiteProxyImpl.fromHandle(handle) {
-    ptr = new _MediaTimelineControlSiteProxyCalls(impl);
-  }
+  MediaTimelineControlSiteProxy.fromHandle(core.MojoHandle handle)
+      : super(new _MediaTimelineControlSiteProxyControl.fromHandle(handle));
 
-  MediaTimelineControlSiteProxy.unbound() :
-      impl = new _MediaTimelineControlSiteProxyImpl.unbound() {
-    ptr = new _MediaTimelineControlSiteProxyCalls(impl);
+  MediaTimelineControlSiteProxy.unbound()
+      : super(new _MediaTimelineControlSiteProxyControl.unbound());
+
+  static MediaTimelineControlSiteProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For MediaTimelineControlSiteProxy"));
+    return new MediaTimelineControlSiteProxy.fromEndpoint(endpoint);
   }
 
   factory MediaTimelineControlSiteProxy.connectToService(
@@ -1395,30 +1327,25 @@
     return p;
   }
 
-  static MediaTimelineControlSiteProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For MediaTimelineControlSiteProxy"));
-    return new MediaTimelineControlSiteProxy.fromEndpoint(endpoint);
+
+  dynamic getStatus(int versionLastSeen,[Function responseFactory = null]) {
+    var params = new _MediaTimelineControlSiteGetStatusParams();
+    params.versionLastSeen = versionLastSeen;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _mediaTimelineControlSiteMethodGetStatusName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
-
-  String get serviceName => MediaTimelineControlSite.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "MediaTimelineControlSiteProxy($impl)";
+  void getTimelineConsumer(Object timelineConsumer) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _MediaTimelineControlSiteGetTimelineConsumerParams();
+    params.timelineConsumer = timelineConsumer;
+    ctrl.sendMessage(params,
+        _mediaTimelineControlSiteMethodGetTimelineConsumerName);
   }
 }
 
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 4d9846f..e471e66 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
@@ -160,24 +160,22 @@
 }
 
 
-class _NativeViewportEventDispatcherProxyImpl extends bindings.Proxy {
-  _NativeViewportEventDispatcherProxyImpl.fromEndpoint(
+class _NativeViewportEventDispatcherProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _NativeViewportEventDispatcherProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _NativeViewportEventDispatcherProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _NativeViewportEventDispatcherProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _NativeViewportEventDispatcherProxyImpl.unbound() : super.unbound();
-
-  static _NativeViewportEventDispatcherProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _NativeViewportEventDispatcherProxyImpl"));
-    return new _NativeViewportEventDispatcherProxyImpl.fromEndpoint(endpoint);
-  }
+  _NativeViewportEventDispatcherProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _NativeViewportEventDispatcherServiceDescription();
+      new _NativeViewportEventDispatcherServiceDescription();
 
+  String get serviceName => NativeViewportEventDispatcher.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _nativeViewportEventDispatcherMethodOnEventName:
@@ -207,51 +205,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_NativeViewportEventDispatcherProxyImpl($superString)";
+    return "_NativeViewportEventDispatcherProxyControl($superString)";
   }
 }
 
 
-class _NativeViewportEventDispatcherProxyCalls implements NativeViewportEventDispatcher {
-  _NativeViewportEventDispatcherProxyImpl _proxyImpl;
-
-  _NativeViewportEventDispatcherProxyCalls(this._proxyImpl);
-    dynamic onEvent(input_events_mojom.Event event,[Function responseFactory = null]) {
-      var params = new _NativeViewportEventDispatcherOnEventParams();
-      params.event = event;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _nativeViewportEventDispatcherMethodOnEventName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-}
-
-
-class NativeViewportEventDispatcherProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  NativeViewportEventDispatcher ptr;
-
-  NativeViewportEventDispatcherProxy(_NativeViewportEventDispatcherProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _NativeViewportEventDispatcherProxyCalls(proxyImpl);
-
+class NativeViewportEventDispatcherProxy extends bindings.Proxy
+                              implements NativeViewportEventDispatcher {
   NativeViewportEventDispatcherProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _NativeViewportEventDispatcherProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _NativeViewportEventDispatcherProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _NativeViewportEventDispatcherProxyControl.fromEndpoint(endpoint));
 
-  NativeViewportEventDispatcherProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _NativeViewportEventDispatcherProxyImpl.fromHandle(handle) {
-    ptr = new _NativeViewportEventDispatcherProxyCalls(impl);
-  }
+  NativeViewportEventDispatcherProxy.fromHandle(core.MojoHandle handle)
+      : super(new _NativeViewportEventDispatcherProxyControl.fromHandle(handle));
 
-  NativeViewportEventDispatcherProxy.unbound() :
-      impl = new _NativeViewportEventDispatcherProxyImpl.unbound() {
-    ptr = new _NativeViewportEventDispatcherProxyCalls(impl);
+  NativeViewportEventDispatcherProxy.unbound()
+      : super(new _NativeViewportEventDispatcherProxyControl.unbound());
+
+  static NativeViewportEventDispatcherProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For NativeViewportEventDispatcherProxy"));
+    return new NativeViewportEventDispatcherProxy.fromEndpoint(endpoint);
   }
 
   factory NativeViewportEventDispatcherProxy.connectToService(
@@ -261,30 +238,15 @@
     return p;
   }
 
-  static NativeViewportEventDispatcherProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For NativeViewportEventDispatcherProxy"));
-    return new NativeViewportEventDispatcherProxy.fromEndpoint(endpoint);
-  }
 
-  String get serviceName => NativeViewportEventDispatcher.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "NativeViewportEventDispatcherProxy($impl)";
+  dynamic onEvent(input_events_mojom.Event event,[Function responseFactory = null]) {
+    var params = new _NativeViewportEventDispatcherOnEventParams();
+    params.event = event;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _nativeViewportEventDispatcherMethodOnEventName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
 }
 
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 c9c7b23..fca8f2f 100644
--- a/mojo/dart/packages/mojo_services/lib/mojo/navigation.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/mojo/navigation.mojom.dart
@@ -325,24 +325,22 @@
 }
 
 
-class _NavigatorHostProxyImpl extends bindings.Proxy {
-  _NavigatorHostProxyImpl.fromEndpoint(
+class _NavigatorHostProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _NavigatorHostProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _NavigatorHostProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _NavigatorHostProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _NavigatorHostProxyImpl.unbound() : super.unbound();
-
-  static _NavigatorHostProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _NavigatorHostProxyImpl"));
-    return new _NavigatorHostProxyImpl.fromEndpoint(endpoint);
-  }
+  _NavigatorHostProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _NavigatorHostServiceDescription();
+      new _NavigatorHostServiceDescription();
 
+  String get serviceName => NavigatorHost.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -352,70 +350,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_NavigatorHostProxyImpl($superString)";
+    return "_NavigatorHostProxyControl($superString)";
   }
 }
 
 
-class _NavigatorHostProxyCalls implements NavigatorHost {
-  _NavigatorHostProxyImpl _proxyImpl;
-
-  _NavigatorHostProxyCalls(this._proxyImpl);
-    void requestNavigate(Target target, url_request_mojom.UrlRequest request) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _NavigatorHostRequestNavigateParams();
-      params.target = target;
-      params.request = request;
-      _proxyImpl.sendMessage(params, _navigatorHostMethodRequestNavigateName);
-    }
-    void requestNavigateHistory(int delta) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _NavigatorHostRequestNavigateHistoryParams();
-      params.delta = delta;
-      _proxyImpl.sendMessage(params, _navigatorHostMethodRequestNavigateHistoryName);
-    }
-    void didNavigateLocally(String url) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _NavigatorHostDidNavigateLocallyParams();
-      params.url = url;
-      _proxyImpl.sendMessage(params, _navigatorHostMethodDidNavigateLocallyName);
-    }
-}
-
-
-class NavigatorHostProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  NavigatorHost ptr;
-
-  NavigatorHostProxy(_NavigatorHostProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _NavigatorHostProxyCalls(proxyImpl);
-
+class NavigatorHostProxy extends bindings.Proxy
+                              implements NavigatorHost {
   NavigatorHostProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _NavigatorHostProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _NavigatorHostProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _NavigatorHostProxyControl.fromEndpoint(endpoint));
 
-  NavigatorHostProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _NavigatorHostProxyImpl.fromHandle(handle) {
-    ptr = new _NavigatorHostProxyCalls(impl);
-  }
+  NavigatorHostProxy.fromHandle(core.MojoHandle handle)
+      : super(new _NavigatorHostProxyControl.fromHandle(handle));
 
-  NavigatorHostProxy.unbound() :
-      impl = new _NavigatorHostProxyImpl.unbound() {
-    ptr = new _NavigatorHostProxyCalls(impl);
+  NavigatorHostProxy.unbound()
+      : super(new _NavigatorHostProxyControl.unbound());
+
+  static NavigatorHostProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For NavigatorHostProxy"));
+    return new NavigatorHostProxy.fromEndpoint(endpoint);
   }
 
   factory NavigatorHostProxy.connectToService(
@@ -425,30 +383,37 @@
     return p;
   }
 
-  static NavigatorHostProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For NavigatorHostProxy"));
-    return new NavigatorHostProxy.fromEndpoint(endpoint);
+
+  void requestNavigate(Target target, url_request_mojom.UrlRequest request) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _NavigatorHostRequestNavigateParams();
+    params.target = target;
+    params.request = request;
+    ctrl.sendMessage(params,
+        _navigatorHostMethodRequestNavigateName);
   }
-
-  String get serviceName => NavigatorHost.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
+  void requestNavigateHistory(int delta) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _NavigatorHostRequestNavigateHistoryParams();
+    params.delta = delta;
+    ctrl.sendMessage(params,
+        _navigatorHostMethodRequestNavigateHistoryName);
   }
-
-  String toString() {
-    return "NavigatorHostProxy($impl)";
+  void didNavigateLocally(String url) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _NavigatorHostDidNavigateLocallyParams();
+    params.url = url;
+    ctrl.sendMessage(params,
+        _navigatorHostMethodDidNavigateLocallyName);
   }
 }
 
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 2a347fc..f0ba093 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
@@ -1026,24 +1026,22 @@
 }
 
 
-class _NetworkServiceProxyImpl extends bindings.Proxy {
-  _NetworkServiceProxyImpl.fromEndpoint(
+class _NetworkServiceProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _NetworkServiceProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _NetworkServiceProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _NetworkServiceProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _NetworkServiceProxyImpl.unbound() : super.unbound();
-
-  static _NetworkServiceProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _NetworkServiceProxyImpl"));
-    return new _NetworkServiceProxyImpl.fromEndpoint(endpoint);
-  }
+  _NetworkServiceProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _NetworkServiceServiceDescription();
+      new _NetworkServiceServiceDescription();
 
+  String get serviceName => NetworkService.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _networkServiceMethodCreateTcpBoundSocketName:
@@ -1113,128 +1111,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_NetworkServiceProxyImpl($superString)";
+    return "_NetworkServiceProxyControl($superString)";
   }
 }
 
 
-class _NetworkServiceProxyCalls implements NetworkService {
-  _NetworkServiceProxyImpl _proxyImpl;
-
-  _NetworkServiceProxyCalls(this._proxyImpl);
-    void createUrlLoader(Object loader) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _NetworkServiceCreateUrlLoaderParams();
-      params.loader = loader;
-      _proxyImpl.sendMessage(params, _networkServiceMethodCreateUrlLoaderName);
-    }
-    void getCookieStore(Object cookieStore) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _NetworkServiceGetCookieStoreParams();
-      params.cookieStore = cookieStore;
-      _proxyImpl.sendMessage(params, _networkServiceMethodGetCookieStoreName);
-    }
-    void createWebSocket(Object socket) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _NetworkServiceCreateWebSocketParams();
-      params.socket = socket;
-      _proxyImpl.sendMessage(params, _networkServiceMethodCreateWebSocketName);
-    }
-    dynamic createTcpBoundSocket(net_address_mojom.NetAddress localAddress,Object boundSocket,[Function responseFactory = null]) {
-      var params = new _NetworkServiceCreateTcpBoundSocketParams();
-      params.localAddress = localAddress;
-      params.boundSocket = boundSocket;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _networkServiceMethodCreateTcpBoundSocketName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    dynamic createTcpConnectedSocket(net_address_mojom.NetAddress remoteAddress,core.MojoDataPipeConsumer sendStream,core.MojoDataPipeProducer receiveStream,Object clientSocket,[Function responseFactory = null]) {
-      var params = new _NetworkServiceCreateTcpConnectedSocketParams();
-      params.remoteAddress = remoteAddress;
-      params.sendStream = sendStream;
-      params.receiveStream = receiveStream;
-      params.clientSocket = clientSocket;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _networkServiceMethodCreateTcpConnectedSocketName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    void createUdpSocket(Object socket) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _NetworkServiceCreateUdpSocketParams();
-      params.socket = socket;
-      _proxyImpl.sendMessage(params, _networkServiceMethodCreateUdpSocketName);
-    }
-    dynamic createHttpServer(net_address_mojom.NetAddress localAddress,Object delegate,[Function responseFactory = null]) {
-      var params = new _NetworkServiceCreateHttpServerParams();
-      params.localAddress = localAddress;
-      params.delegate = delegate;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _networkServiceMethodCreateHttpServerName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    void registerUrlLoaderInterceptor(Object factory) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _NetworkServiceRegisterUrlLoaderInterceptorParams();
-      params.factory = factory;
-      _proxyImpl.sendMessage(params, _networkServiceMethodRegisterUrlLoaderInterceptorName);
-    }
-    void createHostResolver(Object hostResolver) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _NetworkServiceCreateHostResolverParams();
-      params.hostResolver = hostResolver;
-      _proxyImpl.sendMessage(params, _networkServiceMethodCreateHostResolverName);
-    }
-}
-
-
-class NetworkServiceProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  NetworkService ptr;
-
-  NetworkServiceProxy(_NetworkServiceProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _NetworkServiceProxyCalls(proxyImpl);
-
+class NetworkServiceProxy extends bindings.Proxy
+                              implements NetworkService {
   NetworkServiceProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _NetworkServiceProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _NetworkServiceProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _NetworkServiceProxyControl.fromEndpoint(endpoint));
 
-  NetworkServiceProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _NetworkServiceProxyImpl.fromHandle(handle) {
-    ptr = new _NetworkServiceProxyCalls(impl);
-  }
+  NetworkServiceProxy.fromHandle(core.MojoHandle handle)
+      : super(new _NetworkServiceProxyControl.fromHandle(handle));
 
-  NetworkServiceProxy.unbound() :
-      impl = new _NetworkServiceProxyImpl.unbound() {
-    ptr = new _NetworkServiceProxyCalls(impl);
+  NetworkServiceProxy.unbound()
+      : super(new _NetworkServiceProxyControl.unbound());
+
+  static NetworkServiceProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For NetworkServiceProxy"));
+    return new NetworkServiceProxy.fromEndpoint(endpoint);
   }
 
   factory NetworkServiceProxy.connectToService(
@@ -1244,30 +1144,98 @@
     return p;
   }
 
-  static NetworkServiceProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For NetworkServiceProxy"));
-    return new NetworkServiceProxy.fromEndpoint(endpoint);
+
+  void createUrlLoader(Object loader) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _NetworkServiceCreateUrlLoaderParams();
+    params.loader = loader;
+    ctrl.sendMessage(params,
+        _networkServiceMethodCreateUrlLoaderName);
   }
-
-  String get serviceName => NetworkService.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
+  void getCookieStore(Object cookieStore) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _NetworkServiceGetCookieStoreParams();
+    params.cookieStore = cookieStore;
+    ctrl.sendMessage(params,
+        _networkServiceMethodGetCookieStoreName);
   }
-
-  String toString() {
-    return "NetworkServiceProxy($impl)";
+  void createWebSocket(Object socket) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _NetworkServiceCreateWebSocketParams();
+    params.socket = socket;
+    ctrl.sendMessage(params,
+        _networkServiceMethodCreateWebSocketName);
+  }
+  dynamic createTcpBoundSocket(net_address_mojom.NetAddress localAddress,Object boundSocket,[Function responseFactory = null]) {
+    var params = new _NetworkServiceCreateTcpBoundSocketParams();
+    params.localAddress = localAddress;
+    params.boundSocket = boundSocket;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _networkServiceMethodCreateTcpBoundSocketName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
+  }
+  dynamic createTcpConnectedSocket(net_address_mojom.NetAddress remoteAddress,core.MojoDataPipeConsumer sendStream,core.MojoDataPipeProducer receiveStream,Object clientSocket,[Function responseFactory = null]) {
+    var params = new _NetworkServiceCreateTcpConnectedSocketParams();
+    params.remoteAddress = remoteAddress;
+    params.sendStream = sendStream;
+    params.receiveStream = receiveStream;
+    params.clientSocket = clientSocket;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _networkServiceMethodCreateTcpConnectedSocketName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
+  }
+  void createUdpSocket(Object socket) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _NetworkServiceCreateUdpSocketParams();
+    params.socket = socket;
+    ctrl.sendMessage(params,
+        _networkServiceMethodCreateUdpSocketName);
+  }
+  dynamic createHttpServer(net_address_mojom.NetAddress localAddress,Object delegate,[Function responseFactory = null]) {
+    var params = new _NetworkServiceCreateHttpServerParams();
+    params.localAddress = localAddress;
+    params.delegate = delegate;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _networkServiceMethodCreateHttpServerName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
+  }
+  void registerUrlLoaderInterceptor(Object factory) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _NetworkServiceRegisterUrlLoaderInterceptorParams();
+    params.factory = factory;
+    ctrl.sendMessage(params,
+        _networkServiceMethodRegisterUrlLoaderInterceptorName);
+  }
+  void createHostResolver(Object hostResolver) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _NetworkServiceCreateHostResolverParams();
+    params.hostResolver = hostResolver;
+    ctrl.sendMessage(params,
+        _networkServiceMethodCreateHostResolverName);
   }
 }
 
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 93f1373..eb9cb91 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
@@ -128,24 +128,22 @@
 }
 
 
-class _ServiceRegistryProxyImpl extends bindings.Proxy {
-  _ServiceRegistryProxyImpl.fromEndpoint(
+class _ServiceRegistryProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _ServiceRegistryProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _ServiceRegistryProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _ServiceRegistryProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _ServiceRegistryProxyImpl.unbound() : super.unbound();
-
-  static _ServiceRegistryProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _ServiceRegistryProxyImpl"));
-    return new _ServiceRegistryProxyImpl.fromEndpoint(endpoint);
-  }
+  _ServiceRegistryProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _ServiceRegistryServiceDescription();
+      new _ServiceRegistryServiceDescription();
 
+  String get serviceName => ServiceRegistry.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -155,52 +153,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_ServiceRegistryProxyImpl($superString)";
+    return "_ServiceRegistryProxyControl($superString)";
   }
 }
 
 
-class _ServiceRegistryProxyCalls implements ServiceRegistry {
-  _ServiceRegistryProxyImpl _proxyImpl;
-
-  _ServiceRegistryProxyCalls(this._proxyImpl);
-    void addServices(List<String> interfaceNames, Object serviceProvider) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _ServiceRegistryAddServicesParams();
-      params.interfaceNames = interfaceNames;
-      params.serviceProvider = serviceProvider;
-      _proxyImpl.sendMessage(params, _serviceRegistryMethodAddServicesName);
-    }
-}
-
-
-class ServiceRegistryProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  ServiceRegistry ptr;
-
-  ServiceRegistryProxy(_ServiceRegistryProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _ServiceRegistryProxyCalls(proxyImpl);
-
+class ServiceRegistryProxy extends bindings.Proxy
+                              implements ServiceRegistry {
   ServiceRegistryProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _ServiceRegistryProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _ServiceRegistryProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _ServiceRegistryProxyControl.fromEndpoint(endpoint));
 
-  ServiceRegistryProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _ServiceRegistryProxyImpl.fromHandle(handle) {
-    ptr = new _ServiceRegistryProxyCalls(impl);
-  }
+  ServiceRegistryProxy.fromHandle(core.MojoHandle handle)
+      : super(new _ServiceRegistryProxyControl.fromHandle(handle));
 
-  ServiceRegistryProxy.unbound() :
-      impl = new _ServiceRegistryProxyImpl.unbound() {
-    ptr = new _ServiceRegistryProxyCalls(impl);
+  ServiceRegistryProxy.unbound()
+      : super(new _ServiceRegistryProxyControl.unbound());
+
+  static ServiceRegistryProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ServiceRegistryProxy"));
+    return new ServiceRegistryProxy.fromEndpoint(endpoint);
   }
 
   factory ServiceRegistryProxy.connectToService(
@@ -210,30 +186,17 @@
     return p;
   }
 
-  static ServiceRegistryProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For ServiceRegistryProxy"));
-    return new ServiceRegistryProxy.fromEndpoint(endpoint);
-  }
 
-  String get serviceName => ServiceRegistry.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "ServiceRegistryProxy($impl)";
+  void addServices(List<String> interfaceNames, Object serviceProvider) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _ServiceRegistryAddServicesParams();
+    params.interfaceNames = interfaceNames;
+    params.serviceProvider = serviceProvider;
+    ctrl.sendMessage(params,
+        _serviceRegistryMethodAddServicesName);
   }
 }
 
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 c4f912b..9ad5769 100644
--- a/mojo/dart/packages/mojo_services/lib/mojo/sharing.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/mojo/sharing.mojom.dart
@@ -100,24 +100,22 @@
 }
 
 
-class _SharingServiceProxyImpl extends bindings.Proxy {
-  _SharingServiceProxyImpl.fromEndpoint(
+class _SharingServiceProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _SharingServiceProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _SharingServiceProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _SharingServiceProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _SharingServiceProxyImpl.unbound() : super.unbound();
-
-  static _SharingServiceProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _SharingServiceProxyImpl"));
-    return new _SharingServiceProxyImpl.fromEndpoint(endpoint);
-  }
+  _SharingServiceProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _SharingServiceServiceDescription();
+      new _SharingServiceServiceDescription();
 
+  String get serviceName => SharingService.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -127,51 +125,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_SharingServiceProxyImpl($superString)";
+    return "_SharingServiceProxyControl($superString)";
   }
 }
 
 
-class _SharingServiceProxyCalls implements SharingService {
-  _SharingServiceProxyImpl _proxyImpl;
-
-  _SharingServiceProxyCalls(this._proxyImpl);
-    void shareText(String text) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _SharingServiceShareTextParams();
-      params.text = text;
-      _proxyImpl.sendMessage(params, _sharingServiceMethodShareTextName);
-    }
-}
-
-
-class SharingServiceProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  SharingService ptr;
-
-  SharingServiceProxy(_SharingServiceProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _SharingServiceProxyCalls(proxyImpl);
-
+class SharingServiceProxy extends bindings.Proxy
+                              implements SharingService {
   SharingServiceProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _SharingServiceProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _SharingServiceProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _SharingServiceProxyControl.fromEndpoint(endpoint));
 
-  SharingServiceProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _SharingServiceProxyImpl.fromHandle(handle) {
-    ptr = new _SharingServiceProxyCalls(impl);
-  }
+  SharingServiceProxy.fromHandle(core.MojoHandle handle)
+      : super(new _SharingServiceProxyControl.fromHandle(handle));
 
-  SharingServiceProxy.unbound() :
-      impl = new _SharingServiceProxyImpl.unbound() {
-    ptr = new _SharingServiceProxyCalls(impl);
+  SharingServiceProxy.unbound()
+      : super(new _SharingServiceProxyControl.unbound());
+
+  static SharingServiceProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For SharingServiceProxy"));
+    return new SharingServiceProxy.fromEndpoint(endpoint);
   }
 
   factory SharingServiceProxy.connectToService(
@@ -181,30 +158,16 @@
     return p;
   }
 
-  static SharingServiceProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For SharingServiceProxy"));
-    return new SharingServiceProxy.fromEndpoint(endpoint);
-  }
 
-  String get serviceName => SharingService.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "SharingServiceProxy($impl)";
+  void shareText(String text) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _SharingServiceShareTextParams();
+    params.text = text;
+    ctrl.sendMessage(params,
+        _sharingServiceMethodShareTextName);
   }
 }
 
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 b72845b..025a5ec 100644
--- a/mojo/dart/packages/mojo_services/lib/mojo/surfaces.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/mojo/surfaces.mojom.dart
@@ -1262,24 +1262,22 @@
 }
 
 
-class _ResourceReturnerProxyImpl extends bindings.Proxy {
-  _ResourceReturnerProxyImpl.fromEndpoint(
+class _ResourceReturnerProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _ResourceReturnerProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _ResourceReturnerProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _ResourceReturnerProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _ResourceReturnerProxyImpl.unbound() : super.unbound();
-
-  static _ResourceReturnerProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _ResourceReturnerProxyImpl"));
-    return new _ResourceReturnerProxyImpl.fromEndpoint(endpoint);
-  }
+  _ResourceReturnerProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _ResourceReturnerServiceDescription();
+      new _ResourceReturnerServiceDescription();
 
+  String get serviceName => ResourceReturner.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -1289,51 +1287,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_ResourceReturnerProxyImpl($superString)";
+    return "_ResourceReturnerProxyControl($superString)";
   }
 }
 
 
-class _ResourceReturnerProxyCalls implements ResourceReturner {
-  _ResourceReturnerProxyImpl _proxyImpl;
-
-  _ResourceReturnerProxyCalls(this._proxyImpl);
-    void returnResources(List<ReturnedResource> resources) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _ResourceReturnerReturnResourcesParams();
-      params.resources = resources;
-      _proxyImpl.sendMessage(params, _resourceReturnerMethodReturnResourcesName);
-    }
-}
-
-
-class ResourceReturnerProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  ResourceReturner ptr;
-
-  ResourceReturnerProxy(_ResourceReturnerProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _ResourceReturnerProxyCalls(proxyImpl);
-
+class ResourceReturnerProxy extends bindings.Proxy
+                              implements ResourceReturner {
   ResourceReturnerProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _ResourceReturnerProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _ResourceReturnerProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _ResourceReturnerProxyControl.fromEndpoint(endpoint));
 
-  ResourceReturnerProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _ResourceReturnerProxyImpl.fromHandle(handle) {
-    ptr = new _ResourceReturnerProxyCalls(impl);
-  }
+  ResourceReturnerProxy.fromHandle(core.MojoHandle handle)
+      : super(new _ResourceReturnerProxyControl.fromHandle(handle));
 
-  ResourceReturnerProxy.unbound() :
-      impl = new _ResourceReturnerProxyImpl.unbound() {
-    ptr = new _ResourceReturnerProxyCalls(impl);
+  ResourceReturnerProxy.unbound()
+      : super(new _ResourceReturnerProxyControl.unbound());
+
+  static ResourceReturnerProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ResourceReturnerProxy"));
+    return new ResourceReturnerProxy.fromEndpoint(endpoint);
   }
 
   factory ResourceReturnerProxy.connectToService(
@@ -1343,30 +1320,16 @@
     return p;
   }
 
-  static ResourceReturnerProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For ResourceReturnerProxy"));
-    return new ResourceReturnerProxy.fromEndpoint(endpoint);
-  }
 
-  String get serviceName => ResourceReturner.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "ResourceReturnerProxy($impl)";
+  void returnResources(List<ReturnedResource> resources) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _ResourceReturnerReturnResourcesParams();
+    params.resources = resources;
+    ctrl.sendMessage(params,
+        _resourceReturnerMethodReturnResourcesName);
   }
 }
 
@@ -1480,24 +1443,22 @@
 }
 
 
-class _SurfaceProxyImpl extends bindings.Proxy {
-  _SurfaceProxyImpl.fromEndpoint(
+class _SurfaceProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _SurfaceProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _SurfaceProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _SurfaceProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _SurfaceProxyImpl.unbound() : super.unbound();
-
-  static _SurfaceProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _SurfaceProxyImpl"));
-    return new _SurfaceProxyImpl.fromEndpoint(endpoint);
-  }
+  _SurfaceProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _SurfaceServiceDescription();
+      new _SurfaceServiceDescription();
 
+  String get serviceName => Surface.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _surfaceMethodGetIdNamespaceName:
@@ -1547,87 +1508,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_SurfaceProxyImpl($superString)";
+    return "_SurfaceProxyControl($superString)";
   }
 }
 
 
-class _SurfaceProxyCalls implements Surface {
-  _SurfaceProxyImpl _proxyImpl;
-
-  _SurfaceProxyCalls(this._proxyImpl);
-    dynamic getIdNamespace([Function responseFactory = null]) {
-      var params = new _SurfaceGetIdNamespaceParams();
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _surfaceMethodGetIdNamespaceName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    void setResourceReturner(Object returner) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _SurfaceSetResourceReturnerParams();
-      params.returner = returner;
-      _proxyImpl.sendMessage(params, _surfaceMethodSetResourceReturnerName);
-    }
-    void createSurface(int idLocal) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _SurfaceCreateSurfaceParams();
-      params.idLocal = idLocal;
-      _proxyImpl.sendMessage(params, _surfaceMethodCreateSurfaceName);
-    }
-    dynamic submitFrame(int idLocal,Frame frame,[Function responseFactory = null]) {
-      var params = new _SurfaceSubmitFrameParams();
-      params.idLocal = idLocal;
-      params.frame = frame;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _surfaceMethodSubmitFrameName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    void destroySurface(int idLocal) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _SurfaceDestroySurfaceParams();
-      params.idLocal = idLocal;
-      _proxyImpl.sendMessage(params, _surfaceMethodDestroySurfaceName);
-    }
-}
-
-
-class SurfaceProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  Surface ptr;
-
-  SurfaceProxy(_SurfaceProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _SurfaceProxyCalls(proxyImpl);
-
+class SurfaceProxy extends bindings.Proxy
+                              implements Surface {
   SurfaceProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _SurfaceProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _SurfaceProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _SurfaceProxyControl.fromEndpoint(endpoint));
 
-  SurfaceProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _SurfaceProxyImpl.fromHandle(handle) {
-    ptr = new _SurfaceProxyCalls(impl);
-  }
+  SurfaceProxy.fromHandle(core.MojoHandle handle)
+      : super(new _SurfaceProxyControl.fromHandle(handle));
 
-  SurfaceProxy.unbound() :
-      impl = new _SurfaceProxyImpl.unbound() {
-    ptr = new _SurfaceProxyCalls(impl);
+  SurfaceProxy.unbound()
+      : super(new _SurfaceProxyControl.unbound());
+
+  static SurfaceProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For SurfaceProxy"));
+    return new SurfaceProxy.fromEndpoint(endpoint);
   }
 
   factory SurfaceProxy.connectToService(
@@ -1637,30 +1541,54 @@
     return p;
   }
 
-  static SurfaceProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For SurfaceProxy"));
-    return new SurfaceProxy.fromEndpoint(endpoint);
+
+  dynamic getIdNamespace([Function responseFactory = null]) {
+    var params = new _SurfaceGetIdNamespaceParams();
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _surfaceMethodGetIdNamespaceName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
-
-  String get serviceName => Surface.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
+  void setResourceReturner(Object returner) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _SurfaceSetResourceReturnerParams();
+    params.returner = returner;
+    ctrl.sendMessage(params,
+        _surfaceMethodSetResourceReturnerName);
   }
-
-  String toString() {
-    return "SurfaceProxy($impl)";
+  void createSurface(int idLocal) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _SurfaceCreateSurfaceParams();
+    params.idLocal = idLocal;
+    ctrl.sendMessage(params,
+        _surfaceMethodCreateSurfaceName);
+  }
+  dynamic submitFrame(int idLocal,Frame frame,[Function responseFactory = null]) {
+    var params = new _SurfaceSubmitFrameParams();
+    params.idLocal = idLocal;
+    params.frame = frame;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _surfaceMethodSubmitFrameName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
+  }
+  void destroySurface(int idLocal) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _SurfaceDestroySurfaceParams();
+    params.idLocal = idLocal;
+    ctrl.sendMessage(params,
+        _surfaceMethodDestroySurfaceName);
   }
 }
 
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 69b6835..6892ba3 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
@@ -362,24 +362,22 @@
 }
 
 
-class _TcpBoundSocketProxyImpl extends bindings.Proxy {
-  _TcpBoundSocketProxyImpl.fromEndpoint(
+class _TcpBoundSocketProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _TcpBoundSocketProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _TcpBoundSocketProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _TcpBoundSocketProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _TcpBoundSocketProxyImpl.unbound() : super.unbound();
-
-  static _TcpBoundSocketProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _TcpBoundSocketProxyImpl"));
-    return new _TcpBoundSocketProxyImpl.fromEndpoint(endpoint);
-  }
+  _TcpBoundSocketProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _TcpBoundSocketServiceDescription();
+      new _TcpBoundSocketServiceDescription();
 
+  String get serviceName => TcpBoundSocket.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _tcpBoundSocketMethodStartListeningName:
@@ -429,63 +427,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_TcpBoundSocketProxyImpl($superString)";
+    return "_TcpBoundSocketProxyControl($superString)";
   }
 }
 
 
-class _TcpBoundSocketProxyCalls implements TcpBoundSocket {
-  _TcpBoundSocketProxyImpl _proxyImpl;
-
-  _TcpBoundSocketProxyCalls(this._proxyImpl);
-    dynamic startListening(Object server,[Function responseFactory = null]) {
-      var params = new _TcpBoundSocketStartListeningParams();
-      params.server = server;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _tcpBoundSocketMethodStartListeningName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    dynamic connect(net_address_mojom.NetAddress remoteAddress,core.MojoDataPipeConsumer sendStream,core.MojoDataPipeProducer receiveStream,Object clientSocket,[Function responseFactory = null]) {
-      var params = new _TcpBoundSocketConnectParams();
-      params.remoteAddress = remoteAddress;
-      params.sendStream = sendStream;
-      params.receiveStream = receiveStream;
-      params.clientSocket = clientSocket;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _tcpBoundSocketMethodConnectName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-}
-
-
-class TcpBoundSocketProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  TcpBoundSocket ptr;
-
-  TcpBoundSocketProxy(_TcpBoundSocketProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _TcpBoundSocketProxyCalls(proxyImpl);
-
+class TcpBoundSocketProxy extends bindings.Proxy
+                              implements TcpBoundSocket {
   TcpBoundSocketProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _TcpBoundSocketProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _TcpBoundSocketProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _TcpBoundSocketProxyControl.fromEndpoint(endpoint));
 
-  TcpBoundSocketProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _TcpBoundSocketProxyImpl.fromHandle(handle) {
-    ptr = new _TcpBoundSocketProxyCalls(impl);
-  }
+  TcpBoundSocketProxy.fromHandle(core.MojoHandle handle)
+      : super(new _TcpBoundSocketProxyControl.fromHandle(handle));
 
-  TcpBoundSocketProxy.unbound() :
-      impl = new _TcpBoundSocketProxyImpl.unbound() {
-    ptr = new _TcpBoundSocketProxyCalls(impl);
+  TcpBoundSocketProxy.unbound()
+      : super(new _TcpBoundSocketProxyControl.unbound());
+
+  static TcpBoundSocketProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For TcpBoundSocketProxy"));
+    return new TcpBoundSocketProxy.fromEndpoint(endpoint);
   }
 
   factory TcpBoundSocketProxy.connectToService(
@@ -495,30 +460,27 @@
     return p;
   }
 
-  static TcpBoundSocketProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For TcpBoundSocketProxy"));
-    return new TcpBoundSocketProxy.fromEndpoint(endpoint);
+
+  dynamic startListening(Object server,[Function responseFactory = null]) {
+    var params = new _TcpBoundSocketStartListeningParams();
+    params.server = server;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _tcpBoundSocketMethodStartListeningName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
-
-  String get serviceName => TcpBoundSocket.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "TcpBoundSocketProxy($impl)";
+  dynamic connect(net_address_mojom.NetAddress remoteAddress,core.MojoDataPipeConsumer sendStream,core.MojoDataPipeProducer receiveStream,Object clientSocket,[Function responseFactory = null]) {
+    var params = new _TcpBoundSocketConnectParams();
+    params.remoteAddress = remoteAddress;
+    params.sendStream = sendStream;
+    params.receiveStream = receiveStream;
+    params.clientSocket = clientSocket;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _tcpBoundSocketMethodConnectName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
 }
 
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 e6b460f..62d4854 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
@@ -26,24 +26,22 @@
 }
 
 
-class _TcpConnectedSocketProxyImpl extends bindings.Proxy {
-  _TcpConnectedSocketProxyImpl.fromEndpoint(
+class _TcpConnectedSocketProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _TcpConnectedSocketProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _TcpConnectedSocketProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _TcpConnectedSocketProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _TcpConnectedSocketProxyImpl.unbound() : super.unbound();
-
-  static _TcpConnectedSocketProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _TcpConnectedSocketProxyImpl"));
-    return new _TcpConnectedSocketProxyImpl.fromEndpoint(endpoint);
-  }
+  _TcpConnectedSocketProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _TcpConnectedSocketServiceDescription();
+      new _TcpConnectedSocketServiceDescription();
 
+  String get serviceName => TcpConnectedSocket.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -53,40 +51,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_TcpConnectedSocketProxyImpl($superString)";
+    return "_TcpConnectedSocketProxyControl($superString)";
   }
 }
 
 
-class _TcpConnectedSocketProxyCalls implements TcpConnectedSocket {
-  _TcpConnectedSocketProxyCalls(_TcpConnectedSocketProxyImpl _);
-}
-
-
-class TcpConnectedSocketProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  TcpConnectedSocket ptr;
-
-  TcpConnectedSocketProxy(_TcpConnectedSocketProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _TcpConnectedSocketProxyCalls(proxyImpl);
-
+class TcpConnectedSocketProxy extends bindings.Proxy
+                              implements TcpConnectedSocket {
   TcpConnectedSocketProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _TcpConnectedSocketProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _TcpConnectedSocketProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _TcpConnectedSocketProxyControl.fromEndpoint(endpoint));
 
-  TcpConnectedSocketProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _TcpConnectedSocketProxyImpl.fromHandle(handle) {
-    ptr = new _TcpConnectedSocketProxyCalls(impl);
-  }
+  TcpConnectedSocketProxy.fromHandle(core.MojoHandle handle)
+      : super(new _TcpConnectedSocketProxyControl.fromHandle(handle));
 
-  TcpConnectedSocketProxy.unbound() :
-      impl = new _TcpConnectedSocketProxyImpl.unbound() {
-    ptr = new _TcpConnectedSocketProxyCalls(impl);
+  TcpConnectedSocketProxy.unbound()
+      : super(new _TcpConnectedSocketProxyControl.unbound());
+
+  static TcpConnectedSocketProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For TcpConnectedSocketProxy"));
+    return new TcpConnectedSocketProxy.fromEndpoint(endpoint);
   }
 
   factory TcpConnectedSocketProxy.connectToService(
@@ -96,31 +84,7 @@
     return p;
   }
 
-  static TcpConnectedSocketProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For TcpConnectedSocketProxy"));
-    return new TcpConnectedSocketProxy.fromEndpoint(endpoint);
-  }
 
-  String get serviceName => TcpConnectedSocket.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "TcpConnectedSocketProxy($impl)";
-  }
 }
 
 
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 0b358f5..0081bb6 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
@@ -216,24 +216,22 @@
 }
 
 
-class _TcpServerSocketProxyImpl extends bindings.Proxy {
-  _TcpServerSocketProxyImpl.fromEndpoint(
+class _TcpServerSocketProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _TcpServerSocketProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _TcpServerSocketProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _TcpServerSocketProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _TcpServerSocketProxyImpl.unbound() : super.unbound();
-
-  static _TcpServerSocketProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _TcpServerSocketProxyImpl"));
-    return new _TcpServerSocketProxyImpl.fromEndpoint(endpoint);
-  }
+  _TcpServerSocketProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _TcpServerSocketServiceDescription();
+      new _TcpServerSocketServiceDescription();
 
+  String get serviceName => TcpServerSocket.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _tcpServerSocketMethodAcceptName:
@@ -263,53 +261,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_TcpServerSocketProxyImpl($superString)";
+    return "_TcpServerSocketProxyControl($superString)";
   }
 }
 
 
-class _TcpServerSocketProxyCalls implements TcpServerSocket {
-  _TcpServerSocketProxyImpl _proxyImpl;
-
-  _TcpServerSocketProxyCalls(this._proxyImpl);
-    dynamic accept(core.MojoDataPipeConsumer sendStream,core.MojoDataPipeProducer receiveStream,Object clientSocket,[Function responseFactory = null]) {
-      var params = new _TcpServerSocketAcceptParams();
-      params.sendStream = sendStream;
-      params.receiveStream = receiveStream;
-      params.clientSocket = clientSocket;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _tcpServerSocketMethodAcceptName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-}
-
-
-class TcpServerSocketProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  TcpServerSocket ptr;
-
-  TcpServerSocketProxy(_TcpServerSocketProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _TcpServerSocketProxyCalls(proxyImpl);
-
+class TcpServerSocketProxy extends bindings.Proxy
+                              implements TcpServerSocket {
   TcpServerSocketProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _TcpServerSocketProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _TcpServerSocketProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _TcpServerSocketProxyControl.fromEndpoint(endpoint));
 
-  TcpServerSocketProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _TcpServerSocketProxyImpl.fromHandle(handle) {
-    ptr = new _TcpServerSocketProxyCalls(impl);
-  }
+  TcpServerSocketProxy.fromHandle(core.MojoHandle handle)
+      : super(new _TcpServerSocketProxyControl.fromHandle(handle));
 
-  TcpServerSocketProxy.unbound() :
-      impl = new _TcpServerSocketProxyImpl.unbound() {
-    ptr = new _TcpServerSocketProxyCalls(impl);
+  TcpServerSocketProxy.unbound()
+      : super(new _TcpServerSocketProxyControl.unbound());
+
+  static TcpServerSocketProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For TcpServerSocketProxy"));
+    return new TcpServerSocketProxy.fromEndpoint(endpoint);
   }
 
   factory TcpServerSocketProxy.connectToService(
@@ -319,30 +294,17 @@
     return p;
   }
 
-  static TcpServerSocketProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For TcpServerSocketProxy"));
-    return new TcpServerSocketProxy.fromEndpoint(endpoint);
-  }
 
-  String get serviceName => TcpServerSocket.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "TcpServerSocketProxy($impl)";
+  dynamic accept(core.MojoDataPipeConsumer sendStream,core.MojoDataPipeProducer receiveStream,Object clientSocket,[Function responseFactory = null]) {
+    var params = new _TcpServerSocketAcceptParams();
+    params.sendStream = sendStream;
+    params.receiveStream = receiveStream;
+    params.clientSocket = clientSocket;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _tcpServerSocketMethodAcceptName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
 }
 
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 ece34a7..1c143d5 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
@@ -723,24 +723,22 @@
 }
 
 
-class _TerminalProxyImpl extends bindings.Proxy {
-  _TerminalProxyImpl.fromEndpoint(
+class _TerminalProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _TerminalProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _TerminalProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _TerminalProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _TerminalProxyImpl.unbound() : super.unbound();
-
-  static _TerminalProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _TerminalProxyImpl"));
-    return new _TerminalProxyImpl.fromEndpoint(endpoint);
-  }
+  _TerminalProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _TerminalServiceDescription();
+      new _TerminalServiceDescription();
 
+  String get serviceName => Terminal.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _terminalMethodConnectName:
@@ -830,81 +828,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_TerminalProxyImpl($superString)";
+    return "_TerminalProxyControl($superString)";
   }
 }
 
 
-class _TerminalProxyCalls implements Terminal {
-  _TerminalProxyImpl _proxyImpl;
-
-  _TerminalProxyCalls(this._proxyImpl);
-    dynamic connect(Object terminalFile,bool force,[Function responseFactory = null]) {
-      var params = new _TerminalConnectParams();
-      params.terminalFile = terminalFile;
-      params.force = force;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _terminalMethodConnectName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    dynamic connectToClient(Object terminalClient,bool force,[Function responseFactory = null]) {
-      var params = new _TerminalConnectToClientParams();
-      params.terminalClient = terminalClient;
-      params.force = force;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _terminalMethodConnectToClientName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    dynamic getSize([Function responseFactory = null]) {
-      var params = new _TerminalGetSizeParams();
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _terminalMethodGetSizeName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    dynamic setSize(int rows,int columns,bool reset,[Function responseFactory = null]) {
-      var params = new _TerminalSetSizeParams();
-      params.rows = rows;
-      params.columns = columns;
-      params.reset = reset;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _terminalMethodSetSizeName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-}
-
-
-class TerminalProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  Terminal ptr;
-
-  TerminalProxy(_TerminalProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _TerminalProxyCalls(proxyImpl);
-
+class TerminalProxy extends bindings.Proxy
+                              implements Terminal {
   TerminalProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _TerminalProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _TerminalProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _TerminalProxyControl.fromEndpoint(endpoint));
 
-  TerminalProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _TerminalProxyImpl.fromHandle(handle) {
-    ptr = new _TerminalProxyCalls(impl);
-  }
+  TerminalProxy.fromHandle(core.MojoHandle handle)
+      : super(new _TerminalProxyControl.fromHandle(handle));
 
-  TerminalProxy.unbound() :
-      impl = new _TerminalProxyImpl.unbound() {
-    ptr = new _TerminalProxyCalls(impl);
+  TerminalProxy.unbound()
+      : super(new _TerminalProxyControl.unbound());
+
+  static TerminalProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For TerminalProxy"));
+    return new TerminalProxy.fromEndpoint(endpoint);
   }
 
   factory TerminalProxy.connectToService(
@@ -914,30 +861,45 @@
     return p;
   }
 
-  static TerminalProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For TerminalProxy"));
-    return new TerminalProxy.fromEndpoint(endpoint);
+
+  dynamic connect(Object terminalFile,bool force,[Function responseFactory = null]) {
+    var params = new _TerminalConnectParams();
+    params.terminalFile = terminalFile;
+    params.force = force;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _terminalMethodConnectName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
-
-  String get serviceName => Terminal.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
+  dynamic connectToClient(Object terminalClient,bool force,[Function responseFactory = null]) {
+    var params = new _TerminalConnectToClientParams();
+    params.terminalClient = terminalClient;
+    params.force = force;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _terminalMethodConnectToClientName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
-
-  String toString() {
-    return "TerminalProxy($impl)";
+  dynamic getSize([Function responseFactory = null]) {
+    var params = new _TerminalGetSizeParams();
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _terminalMethodGetSizeName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
+  }
+  dynamic setSize(int rows,int columns,bool reset,[Function responseFactory = null]) {
+    var params = new _TerminalSetSizeParams();
+    params.rows = rows;
+    params.columns = columns;
+    params.reset = reset;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _terminalMethodSetSizeName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
 }
 
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 117680e..3864a74 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
@@ -100,24 +100,22 @@
 }
 
 
-class _TerminalClientProxyImpl extends bindings.Proxy {
-  _TerminalClientProxyImpl.fromEndpoint(
+class _TerminalClientProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _TerminalClientProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _TerminalClientProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _TerminalClientProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _TerminalClientProxyImpl.unbound() : super.unbound();
-
-  static _TerminalClientProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _TerminalClientProxyImpl"));
-    return new _TerminalClientProxyImpl.fromEndpoint(endpoint);
-  }
+  _TerminalClientProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _TerminalClientServiceDescription();
+      new _TerminalClientServiceDescription();
 
+  String get serviceName => TerminalClient.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -127,51 +125,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_TerminalClientProxyImpl($superString)";
+    return "_TerminalClientProxyControl($superString)";
   }
 }
 
 
-class _TerminalClientProxyCalls implements TerminalClient {
-  _TerminalClientProxyImpl _proxyImpl;
-
-  _TerminalClientProxyCalls(this._proxyImpl);
-    void connectToTerminal(Object terminal) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _TerminalClientConnectToTerminalParams();
-      params.terminal = terminal;
-      _proxyImpl.sendMessage(params, _terminalClientMethodConnectToTerminalName);
-    }
-}
-
-
-class TerminalClientProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  TerminalClient ptr;
-
-  TerminalClientProxy(_TerminalClientProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _TerminalClientProxyCalls(proxyImpl);
-
+class TerminalClientProxy extends bindings.Proxy
+                              implements TerminalClient {
   TerminalClientProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _TerminalClientProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _TerminalClientProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _TerminalClientProxyControl.fromEndpoint(endpoint));
 
-  TerminalClientProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _TerminalClientProxyImpl.fromHandle(handle) {
-    ptr = new _TerminalClientProxyCalls(impl);
-  }
+  TerminalClientProxy.fromHandle(core.MojoHandle handle)
+      : super(new _TerminalClientProxyControl.fromHandle(handle));
 
-  TerminalClientProxy.unbound() :
-      impl = new _TerminalClientProxyImpl.unbound() {
-    ptr = new _TerminalClientProxyCalls(impl);
+  TerminalClientProxy.unbound()
+      : super(new _TerminalClientProxyControl.unbound());
+
+  static TerminalClientProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For TerminalClientProxy"));
+    return new TerminalClientProxy.fromEndpoint(endpoint);
   }
 
   factory TerminalClientProxy.connectToService(
@@ -181,30 +158,16 @@
     return p;
   }
 
-  static TerminalClientProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For TerminalClientProxy"));
-    return new TerminalClientProxy.fromEndpoint(endpoint);
-  }
 
-  String get serviceName => TerminalClient.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "TerminalClientProxy($impl)";
+  void connectToTerminal(Object terminal) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _TerminalClientConnectToTerminalParams();
+    params.terminal = terminal;
+    ctrl.sendMessage(params,
+        _terminalClientMethodConnectToTerminalName);
   }
 }
 
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 db683eb..077297d 100644
--- a/mojo/dart/packages/mojo_services/lib/mojo/timelines.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/mojo/timelines.mojom.dart
@@ -343,24 +343,22 @@
 }
 
 
-class _TimelineConsumerProxyImpl extends bindings.Proxy {
-  _TimelineConsumerProxyImpl.fromEndpoint(
+class _TimelineConsumerProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _TimelineConsumerProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _TimelineConsumerProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _TimelineConsumerProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _TimelineConsumerProxyImpl.unbound() : super.unbound();
-
-  static _TimelineConsumerProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _TimelineConsumerProxyImpl"));
-    return new _TimelineConsumerProxyImpl.fromEndpoint(endpoint);
-  }
+  _TimelineConsumerProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _TimelineConsumerServiceDescription();
+      new _TimelineConsumerServiceDescription();
 
+  String get serviceName => TimelineConsumer.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _timelineConsumerMethodSetTimelineTransformName:
@@ -390,55 +388,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_TimelineConsumerProxyImpl($superString)";
+    return "_TimelineConsumerProxyControl($superString)";
   }
 }
 
 
-class _TimelineConsumerProxyCalls implements TimelineConsumer {
-  _TimelineConsumerProxyImpl _proxyImpl;
-
-  _TimelineConsumerProxyCalls(this._proxyImpl);
-    dynamic setTimelineTransform(int subjectTime,int referenceDelta,int subjectDelta,int effectiveReferenceTime,int effectiveSubjectTime,[Function responseFactory = null]) {
-      var params = new _TimelineConsumerSetTimelineTransformParams();
-      params.subjectTime = subjectTime;
-      params.referenceDelta = referenceDelta;
-      params.subjectDelta = subjectDelta;
-      params.effectiveReferenceTime = effectiveReferenceTime;
-      params.effectiveSubjectTime = effectiveSubjectTime;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _timelineConsumerMethodSetTimelineTransformName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-}
-
-
-class TimelineConsumerProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  TimelineConsumer ptr;
-
-  TimelineConsumerProxy(_TimelineConsumerProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _TimelineConsumerProxyCalls(proxyImpl);
-
+class TimelineConsumerProxy extends bindings.Proxy
+                              implements TimelineConsumer {
   TimelineConsumerProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _TimelineConsumerProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _TimelineConsumerProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _TimelineConsumerProxyControl.fromEndpoint(endpoint));
 
-  TimelineConsumerProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _TimelineConsumerProxyImpl.fromHandle(handle) {
-    ptr = new _TimelineConsumerProxyCalls(impl);
-  }
+  TimelineConsumerProxy.fromHandle(core.MojoHandle handle)
+      : super(new _TimelineConsumerProxyControl.fromHandle(handle));
 
-  TimelineConsumerProxy.unbound() :
-      impl = new _TimelineConsumerProxyImpl.unbound() {
-    ptr = new _TimelineConsumerProxyCalls(impl);
+  TimelineConsumerProxy.unbound()
+      : super(new _TimelineConsumerProxyControl.unbound());
+
+  static TimelineConsumerProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For TimelineConsumerProxy"));
+    return new TimelineConsumerProxy.fromEndpoint(endpoint);
   }
 
   factory TimelineConsumerProxy.connectToService(
@@ -448,30 +421,19 @@
     return p;
   }
 
-  static TimelineConsumerProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For TimelineConsumerProxy"));
-    return new TimelineConsumerProxy.fromEndpoint(endpoint);
-  }
 
-  String get serviceName => TimelineConsumer.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "TimelineConsumerProxy($impl)";
+  dynamic setTimelineTransform(int subjectTime,int referenceDelta,int subjectDelta,int effectiveReferenceTime,int effectiveSubjectTime,[Function responseFactory = null]) {
+    var params = new _TimelineConsumerSetTimelineTransformParams();
+    params.subjectTime = subjectTime;
+    params.referenceDelta = referenceDelta;
+    params.subjectDelta = subjectDelta;
+    params.effectiveReferenceTime = effectiveReferenceTime;
+    params.effectiveSubjectTime = effectiveSubjectTime;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _timelineConsumerMethodSetTimelineTransformName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
 }
 
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 43d1a94..5a354ae 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
@@ -1287,24 +1287,22 @@
 }
 
 
-class _UdpSocketProxyImpl extends bindings.Proxy {
-  _UdpSocketProxyImpl.fromEndpoint(
+class _UdpSocketProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _UdpSocketProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _UdpSocketProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _UdpSocketProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _UdpSocketProxyImpl.unbound() : super.unbound();
-
-  static _UdpSocketProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _UdpSocketProxyImpl"));
-    return new _UdpSocketProxyImpl.fromEndpoint(endpoint);
-  }
+  _UdpSocketProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _UdpSocketServiceDescription();
+      new _UdpSocketServiceDescription();
 
+  String get serviceName => UdpSocket.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _udpSocketMethodAllowAddressReuseName:
@@ -1454,114 +1452,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_UdpSocketProxyImpl($superString)";
+    return "_UdpSocketProxyControl($superString)";
   }
 }
 
 
-class _UdpSocketProxyCalls implements UdpSocket {
-  _UdpSocketProxyImpl _proxyImpl;
-
-  _UdpSocketProxyCalls(this._proxyImpl);
-    dynamic allowAddressReuse([Function responseFactory = null]) {
-      var params = new _UdpSocketAllowAddressReuseParams();
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _udpSocketMethodAllowAddressReuseName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    dynamic bind(net_address_mojom.NetAddress addr,[Function responseFactory = null]) {
-      var params = new _UdpSocketBindParams();
-      params.addr = addr;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _udpSocketMethodBindName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    dynamic connect(net_address_mojom.NetAddress remoteAddr,[Function responseFactory = null]) {
-      var params = new _UdpSocketConnectParams();
-      params.remoteAddr = remoteAddr;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _udpSocketMethodConnectName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    dynamic setSendBufferSize(int size,[Function responseFactory = null]) {
-      var params = new _UdpSocketSetSendBufferSizeParams();
-      params.size = size;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _udpSocketMethodSetSendBufferSizeName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    dynamic setReceiveBufferSize(int size,[Function responseFactory = null]) {
-      var params = new _UdpSocketSetReceiveBufferSizeParams();
-      params.size = size;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _udpSocketMethodSetReceiveBufferSizeName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    dynamic negotiateMaxPendingSendRequests(int requestedSize,[Function responseFactory = null]) {
-      var params = new _UdpSocketNegotiateMaxPendingSendRequestsParams();
-      params.requestedSize = requestedSize;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _udpSocketMethodNegotiateMaxPendingSendRequestsName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    void receiveMore(int datagramNumber) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _UdpSocketReceiveMoreParams();
-      params.datagramNumber = datagramNumber;
-      _proxyImpl.sendMessage(params, _udpSocketMethodReceiveMoreName);
-    }
-    dynamic sendTo(net_address_mojom.NetAddress destAddr,List<int> data,[Function responseFactory = null]) {
-      var params = new _UdpSocketSendToParams();
-      params.destAddr = destAddr;
-      params.data = data;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _udpSocketMethodSendToName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-}
-
-
-class UdpSocketProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  UdpSocket ptr;
-
-  UdpSocketProxy(_UdpSocketProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _UdpSocketProxyCalls(proxyImpl);
-
+class UdpSocketProxy extends bindings.Proxy
+                              implements UdpSocket {
   UdpSocketProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _UdpSocketProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _UdpSocketProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _UdpSocketProxyControl.fromEndpoint(endpoint));
 
-  UdpSocketProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _UdpSocketProxyImpl.fromHandle(handle) {
-    ptr = new _UdpSocketProxyCalls(impl);
-  }
+  UdpSocketProxy.fromHandle(core.MojoHandle handle)
+      : super(new _UdpSocketProxyControl.fromHandle(handle));
 
-  UdpSocketProxy.unbound() :
-      impl = new _UdpSocketProxyImpl.unbound() {
-    ptr = new _UdpSocketProxyCalls(impl);
+  UdpSocketProxy.unbound()
+      : super(new _UdpSocketProxyControl.unbound());
+
+  static UdpSocketProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For UdpSocketProxy"));
+    return new UdpSocketProxy.fromEndpoint(endpoint);
   }
 
   factory UdpSocketProxy.connectToService(
@@ -1571,30 +1485,79 @@
     return p;
   }
 
-  static UdpSocketProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For UdpSocketProxy"));
-    return new UdpSocketProxy.fromEndpoint(endpoint);
+
+  dynamic allowAddressReuse([Function responseFactory = null]) {
+    var params = new _UdpSocketAllowAddressReuseParams();
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _udpSocketMethodAllowAddressReuseName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
-
-  String get serviceName => UdpSocket.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
+  dynamic bind(net_address_mojom.NetAddress addr,[Function responseFactory = null]) {
+    var params = new _UdpSocketBindParams();
+    params.addr = addr;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _udpSocketMethodBindName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
-
-  String toString() {
-    return "UdpSocketProxy($impl)";
+  dynamic connect(net_address_mojom.NetAddress remoteAddr,[Function responseFactory = null]) {
+    var params = new _UdpSocketConnectParams();
+    params.remoteAddr = remoteAddr;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _udpSocketMethodConnectName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
+  }
+  dynamic setSendBufferSize(int size,[Function responseFactory = null]) {
+    var params = new _UdpSocketSetSendBufferSizeParams();
+    params.size = size;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _udpSocketMethodSetSendBufferSizeName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
+  }
+  dynamic setReceiveBufferSize(int size,[Function responseFactory = null]) {
+    var params = new _UdpSocketSetReceiveBufferSizeParams();
+    params.size = size;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _udpSocketMethodSetReceiveBufferSizeName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
+  }
+  dynamic negotiateMaxPendingSendRequests(int requestedSize,[Function responseFactory = null]) {
+    var params = new _UdpSocketNegotiateMaxPendingSendRequestsParams();
+    params.requestedSize = requestedSize;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _udpSocketMethodNegotiateMaxPendingSendRequestsName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
+  }
+  void receiveMore(int datagramNumber) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _UdpSocketReceiveMoreParams();
+    params.datagramNumber = datagramNumber;
+    ctrl.sendMessage(params,
+        _udpSocketMethodReceiveMoreName);
+  }
+  dynamic sendTo(net_address_mojom.NetAddress destAddr,List<int> data,[Function responseFactory = null]) {
+    var params = new _UdpSocketSendToParams();
+    params.destAddr = destAddr;
+    params.data = data;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _udpSocketMethodSendToName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
 }
 
@@ -1891,24 +1854,22 @@
 }
 
 
-class _UdpSocketReceiverProxyImpl extends bindings.Proxy {
-  _UdpSocketReceiverProxyImpl.fromEndpoint(
+class _UdpSocketReceiverProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _UdpSocketReceiverProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _UdpSocketReceiverProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _UdpSocketReceiverProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _UdpSocketReceiverProxyImpl.unbound() : super.unbound();
-
-  static _UdpSocketReceiverProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _UdpSocketReceiverProxyImpl"));
-    return new _UdpSocketReceiverProxyImpl.fromEndpoint(endpoint);
-  }
+  _UdpSocketReceiverProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _UdpSocketReceiverServiceDescription();
+      new _UdpSocketReceiverServiceDescription();
 
+  String get serviceName => UdpSocketReceiver.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -1918,53 +1879,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_UdpSocketReceiverProxyImpl($superString)";
+    return "_UdpSocketReceiverProxyControl($superString)";
   }
 }
 
 
-class _UdpSocketReceiverProxyCalls implements UdpSocketReceiver {
-  _UdpSocketReceiverProxyImpl _proxyImpl;
-
-  _UdpSocketReceiverProxyCalls(this._proxyImpl);
-    void onReceived(network_error_mojom.NetworkError result, net_address_mojom.NetAddress srcAddr, List<int> data) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _UdpSocketReceiverOnReceivedParams();
-      params.result = result;
-      params.srcAddr = srcAddr;
-      params.data = data;
-      _proxyImpl.sendMessage(params, _udpSocketReceiverMethodOnReceivedName);
-    }
-}
-
-
-class UdpSocketReceiverProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  UdpSocketReceiver ptr;
-
-  UdpSocketReceiverProxy(_UdpSocketReceiverProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _UdpSocketReceiverProxyCalls(proxyImpl);
-
+class UdpSocketReceiverProxy extends bindings.Proxy
+                              implements UdpSocketReceiver {
   UdpSocketReceiverProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _UdpSocketReceiverProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _UdpSocketReceiverProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _UdpSocketReceiverProxyControl.fromEndpoint(endpoint));
 
-  UdpSocketReceiverProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _UdpSocketReceiverProxyImpl.fromHandle(handle) {
-    ptr = new _UdpSocketReceiverProxyCalls(impl);
-  }
+  UdpSocketReceiverProxy.fromHandle(core.MojoHandle handle)
+      : super(new _UdpSocketReceiverProxyControl.fromHandle(handle));
 
-  UdpSocketReceiverProxy.unbound() :
-      impl = new _UdpSocketReceiverProxyImpl.unbound() {
-    ptr = new _UdpSocketReceiverProxyCalls(impl);
+  UdpSocketReceiverProxy.unbound()
+      : super(new _UdpSocketReceiverProxyControl.unbound());
+
+  static UdpSocketReceiverProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For UdpSocketReceiverProxy"));
+    return new UdpSocketReceiverProxy.fromEndpoint(endpoint);
   }
 
   factory UdpSocketReceiverProxy.connectToService(
@@ -1974,30 +1912,18 @@
     return p;
   }
 
-  static UdpSocketReceiverProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For UdpSocketReceiverProxy"));
-    return new UdpSocketReceiverProxy.fromEndpoint(endpoint);
-  }
 
-  String get serviceName => UdpSocketReceiver.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "UdpSocketReceiverProxy($impl)";
+  void onReceived(network_error_mojom.NetworkError result, net_address_mojom.NetAddress srcAddr, List<int> data) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _UdpSocketReceiverOnReceivedParams();
+    params.result = result;
+    params.srcAddr = srcAddr;
+    params.data = data;
+    ctrl.sendMessage(params,
+        _udpSocketReceiverMethodOnReceivedName);
   }
 }
 
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 6ea4682..4375a69 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
@@ -245,24 +245,22 @@
 }
 
 
-class _InputConnectionProxyImpl extends bindings.Proxy {
-  _InputConnectionProxyImpl.fromEndpoint(
+class _InputConnectionProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _InputConnectionProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _InputConnectionProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _InputConnectionProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _InputConnectionProxyImpl.unbound() : super.unbound();
-
-  static _InputConnectionProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _InputConnectionProxyImpl"));
-    return new _InputConnectionProxyImpl.fromEndpoint(endpoint);
-  }
+  _InputConnectionProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _InputConnectionServiceDescription();
+      new _InputConnectionServiceDescription();
 
+  String get serviceName => InputConnection.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -272,51 +270,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_InputConnectionProxyImpl($superString)";
+    return "_InputConnectionProxyControl($superString)";
   }
 }
 
 
-class _InputConnectionProxyCalls implements InputConnection {
-  _InputConnectionProxyImpl _proxyImpl;
-
-  _InputConnectionProxyCalls(this._proxyImpl);
-    void setListener(Object listener) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _InputConnectionSetListenerParams();
-      params.listener = listener;
-      _proxyImpl.sendMessage(params, _inputConnectionMethodSetListenerName);
-    }
-}
-
-
-class InputConnectionProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  InputConnection ptr;
-
-  InputConnectionProxy(_InputConnectionProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _InputConnectionProxyCalls(proxyImpl);
-
+class InputConnectionProxy extends bindings.Proxy
+                              implements InputConnection {
   InputConnectionProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _InputConnectionProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _InputConnectionProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _InputConnectionProxyControl.fromEndpoint(endpoint));
 
-  InputConnectionProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _InputConnectionProxyImpl.fromHandle(handle) {
-    ptr = new _InputConnectionProxyCalls(impl);
-  }
+  InputConnectionProxy.fromHandle(core.MojoHandle handle)
+      : super(new _InputConnectionProxyControl.fromHandle(handle));
 
-  InputConnectionProxy.unbound() :
-      impl = new _InputConnectionProxyImpl.unbound() {
-    ptr = new _InputConnectionProxyCalls(impl);
+  InputConnectionProxy.unbound()
+      : super(new _InputConnectionProxyControl.unbound());
+
+  static InputConnectionProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For InputConnectionProxy"));
+    return new InputConnectionProxy.fromEndpoint(endpoint);
   }
 
   factory InputConnectionProxy.connectToService(
@@ -326,30 +303,16 @@
     return p;
   }
 
-  static InputConnectionProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For InputConnectionProxy"));
-    return new InputConnectionProxy.fromEndpoint(endpoint);
-  }
 
-  String get serviceName => InputConnection.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "InputConnectionProxy($impl)";
+  void setListener(Object listener) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _InputConnectionSetListenerParams();
+    params.listener = listener;
+    ctrl.sendMessage(params,
+        _inputConnectionMethodSetListenerName);
   }
 }
 
@@ -455,24 +418,22 @@
 }
 
 
-class _InputListenerProxyImpl extends bindings.Proxy {
-  _InputListenerProxyImpl.fromEndpoint(
+class _InputListenerProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _InputListenerProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _InputListenerProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _InputListenerProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _InputListenerProxyImpl.unbound() : super.unbound();
-
-  static _InputListenerProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _InputListenerProxyImpl"));
-    return new _InputListenerProxyImpl.fromEndpoint(endpoint);
-  }
+  _InputListenerProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _InputListenerServiceDescription();
+      new _InputListenerServiceDescription();
 
+  String get serviceName => InputListener.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _inputListenerMethodOnEventName:
@@ -502,51 +463,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_InputListenerProxyImpl($superString)";
+    return "_InputListenerProxyControl($superString)";
   }
 }
 
 
-class _InputListenerProxyCalls implements InputListener {
-  _InputListenerProxyImpl _proxyImpl;
-
-  _InputListenerProxyCalls(this._proxyImpl);
-    dynamic onEvent(input_events_mojom.Event event,[Function responseFactory = null]) {
-      var params = new _InputListenerOnEventParams();
-      params.event = event;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _inputListenerMethodOnEventName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-}
-
-
-class InputListenerProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  InputListener ptr;
-
-  InputListenerProxy(_InputListenerProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _InputListenerProxyCalls(proxyImpl);
-
+class InputListenerProxy extends bindings.Proxy
+                              implements InputListener {
   InputListenerProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _InputListenerProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _InputListenerProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _InputListenerProxyControl.fromEndpoint(endpoint));
 
-  InputListenerProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _InputListenerProxyImpl.fromHandle(handle) {
-    ptr = new _InputListenerProxyCalls(impl);
-  }
+  InputListenerProxy.fromHandle(core.MojoHandle handle)
+      : super(new _InputListenerProxyControl.fromHandle(handle));
 
-  InputListenerProxy.unbound() :
-      impl = new _InputListenerProxyImpl.unbound() {
-    ptr = new _InputListenerProxyCalls(impl);
+  InputListenerProxy.unbound()
+      : super(new _InputListenerProxyControl.unbound());
+
+  static InputListenerProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For InputListenerProxy"));
+    return new InputListenerProxy.fromEndpoint(endpoint);
   }
 
   factory InputListenerProxy.connectToService(
@@ -556,30 +496,15 @@
     return p;
   }
 
-  static InputListenerProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For InputListenerProxy"));
-    return new InputListenerProxy.fromEndpoint(endpoint);
-  }
 
-  String get serviceName => InputListener.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "InputListenerProxy($impl)";
+  dynamic onEvent(input_events_mojom.Event event,[Function responseFactory = null]) {
+    var params = new _InputListenerOnEventParams();
+    params.event = event;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _inputListenerMethodOnEventName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
 }
 
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 c326cf7..b2dfd95 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
@@ -102,24 +102,22 @@
 }
 
 
-class _InputDispatcherProxyImpl extends bindings.Proxy {
-  _InputDispatcherProxyImpl.fromEndpoint(
+class _InputDispatcherProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _InputDispatcherProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _InputDispatcherProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _InputDispatcherProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _InputDispatcherProxyImpl.unbound() : super.unbound();
-
-  static _InputDispatcherProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _InputDispatcherProxyImpl"));
-    return new _InputDispatcherProxyImpl.fromEndpoint(endpoint);
-  }
+  _InputDispatcherProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _InputDispatcherServiceDescription();
+      new _InputDispatcherServiceDescription();
 
+  String get serviceName => InputDispatcher.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -129,51 +127,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_InputDispatcherProxyImpl($superString)";
+    return "_InputDispatcherProxyControl($superString)";
   }
 }
 
 
-class _InputDispatcherProxyCalls implements InputDispatcher {
-  _InputDispatcherProxyImpl _proxyImpl;
-
-  _InputDispatcherProxyCalls(this._proxyImpl);
-    void dispatchEvent(input_events_mojom.Event event) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _InputDispatcherDispatchEventParams();
-      params.event = event;
-      _proxyImpl.sendMessage(params, _inputDispatcherMethodDispatchEventName);
-    }
-}
-
-
-class InputDispatcherProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  InputDispatcher ptr;
-
-  InputDispatcherProxy(_InputDispatcherProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _InputDispatcherProxyCalls(proxyImpl);
-
+class InputDispatcherProxy extends bindings.Proxy
+                              implements InputDispatcher {
   InputDispatcherProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _InputDispatcherProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _InputDispatcherProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _InputDispatcherProxyControl.fromEndpoint(endpoint));
 
-  InputDispatcherProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _InputDispatcherProxyImpl.fromHandle(handle) {
-    ptr = new _InputDispatcherProxyCalls(impl);
-  }
+  InputDispatcherProxy.fromHandle(core.MojoHandle handle)
+      : super(new _InputDispatcherProxyControl.fromHandle(handle));
 
-  InputDispatcherProxy.unbound() :
-      impl = new _InputDispatcherProxyImpl.unbound() {
-    ptr = new _InputDispatcherProxyCalls(impl);
+  InputDispatcherProxy.unbound()
+      : super(new _InputDispatcherProxyControl.unbound());
+
+  static InputDispatcherProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For InputDispatcherProxy"));
+    return new InputDispatcherProxy.fromEndpoint(endpoint);
   }
 
   factory InputDispatcherProxy.connectToService(
@@ -183,30 +160,16 @@
     return p;
   }
 
-  static InputDispatcherProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For InputDispatcherProxy"));
-    return new InputDispatcherProxy.fromEndpoint(endpoint);
-  }
 
-  String get serviceName => InputDispatcher.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "InputDispatcherProxy($impl)";
+  void dispatchEvent(input_events_mojom.Event event) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _InputDispatcherDispatchEventParams();
+    params.event = event;
+    ctrl.sendMessage(params,
+        _inputDispatcherMethodDispatchEventName);
   }
 }
 
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 8640f9a..4baf574 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
@@ -829,24 +829,22 @@
 }
 
 
-class _ViewAssociateProxyImpl extends bindings.Proxy {
-  _ViewAssociateProxyImpl.fromEndpoint(
+class _ViewAssociateProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _ViewAssociateProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _ViewAssociateProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _ViewAssociateProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _ViewAssociateProxyImpl.unbound() : super.unbound();
-
-  static _ViewAssociateProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _ViewAssociateProxyImpl"));
-    return new _ViewAssociateProxyImpl.fromEndpoint(endpoint);
-  }
+  _ViewAssociateProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _ViewAssociateServiceDescription();
+      new _ViewAssociateServiceDescription();
 
+  String get serviceName => ViewAssociate.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _viewAssociateMethodConnectName:
@@ -876,73 +874,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_ViewAssociateProxyImpl($superString)";
+    return "_ViewAssociateProxyControl($superString)";
   }
 }
 
 
-class _ViewAssociateProxyCalls implements ViewAssociate {
-  _ViewAssociateProxyImpl _proxyImpl;
-
-  _ViewAssociateProxyCalls(this._proxyImpl);
-    dynamic connect(Object inspector,[Function responseFactory = null]) {
-      var params = new _ViewAssociateConnectParams();
-      params.inspector = inspector;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _viewAssociateMethodConnectName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    void connectToViewService(view_token_mojom.ViewToken viewToken, String serviceName_, core.MojoMessagePipeEndpoint pipe) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _ViewAssociateConnectToViewServiceParams();
-      params.viewToken = viewToken;
-      params.serviceName_ = serviceName_;
-      params.pipe = pipe;
-      _proxyImpl.sendMessage(params, _viewAssociateMethodConnectToViewServiceName);
-    }
-    void connectToViewTreeService(view_tree_token_mojom.ViewTreeToken viewTreeToken, String serviceName_, core.MojoMessagePipeEndpoint pipe) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _ViewAssociateConnectToViewTreeServiceParams();
-      params.viewTreeToken = viewTreeToken;
-      params.serviceName_ = serviceName_;
-      params.pipe = pipe;
-      _proxyImpl.sendMessage(params, _viewAssociateMethodConnectToViewTreeServiceName);
-    }
-}
-
-
-class ViewAssociateProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  ViewAssociate ptr;
-
-  ViewAssociateProxy(_ViewAssociateProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _ViewAssociateProxyCalls(proxyImpl);
-
+class ViewAssociateProxy extends bindings.Proxy
+                              implements ViewAssociate {
   ViewAssociateProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _ViewAssociateProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _ViewAssociateProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _ViewAssociateProxyControl.fromEndpoint(endpoint));
 
-  ViewAssociateProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _ViewAssociateProxyImpl.fromHandle(handle) {
-    ptr = new _ViewAssociateProxyCalls(impl);
-  }
+  ViewAssociateProxy.fromHandle(core.MojoHandle handle)
+      : super(new _ViewAssociateProxyControl.fromHandle(handle));
 
-  ViewAssociateProxy.unbound() :
-      impl = new _ViewAssociateProxyImpl.unbound() {
-    ptr = new _ViewAssociateProxyCalls(impl);
+  ViewAssociateProxy.unbound()
+      : super(new _ViewAssociateProxyControl.unbound());
+
+  static ViewAssociateProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ViewAssociateProxy"));
+    return new ViewAssociateProxy.fromEndpoint(endpoint);
   }
 
   factory ViewAssociateProxy.connectToService(
@@ -952,30 +907,39 @@
     return p;
   }
 
-  static ViewAssociateProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For ViewAssociateProxy"));
-    return new ViewAssociateProxy.fromEndpoint(endpoint);
+
+  dynamic connect(Object inspector,[Function responseFactory = null]) {
+    var params = new _ViewAssociateConnectParams();
+    params.inspector = inspector;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _viewAssociateMethodConnectName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
-
-  String get serviceName => ViewAssociate.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
+  void connectToViewService(view_token_mojom.ViewToken viewToken, String serviceName_, core.MojoMessagePipeEndpoint pipe) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _ViewAssociateConnectToViewServiceParams();
+    params.viewToken = viewToken;
+    params.serviceName_ = serviceName_;
+    params.pipe = pipe;
+    ctrl.sendMessage(params,
+        _viewAssociateMethodConnectToViewServiceName);
   }
-
-  String toString() {
-    return "ViewAssociateProxy($impl)";
+  void connectToViewTreeService(view_tree_token_mojom.ViewTreeToken viewTreeToken, String serviceName_, core.MojoMessagePipeEndpoint pipe) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _ViewAssociateConnectToViewTreeServiceParams();
+    params.viewTreeToken = viewTreeToken;
+    params.serviceName_ = serviceName_;
+    params.pipe = pipe;
+    ctrl.sendMessage(params,
+        _viewAssociateMethodConnectToViewTreeServiceName);
   }
 }
 
@@ -1115,24 +1079,22 @@
 }
 
 
-class _ViewInspectorProxyImpl extends bindings.Proxy {
-  _ViewInspectorProxyImpl.fromEndpoint(
+class _ViewInspectorProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _ViewInspectorProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _ViewInspectorProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _ViewInspectorProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _ViewInspectorProxyImpl.unbound() : super.unbound();
-
-  static _ViewInspectorProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _ViewInspectorProxyImpl"));
-    return new _ViewInspectorProxyImpl.fromEndpoint(endpoint);
-  }
+  _ViewInspectorProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _ViewInspectorServiceDescription();
+      new _ViewInspectorServiceDescription();
 
+  String get serviceName => ViewInspector.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _viewInspectorMethodGetHitTesterName:
@@ -1182,61 +1144,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_ViewInspectorProxyImpl($superString)";
+    return "_ViewInspectorProxyControl($superString)";
   }
 }
 
 
-class _ViewInspectorProxyCalls implements ViewInspector {
-  _ViewInspectorProxyImpl _proxyImpl;
-
-  _ViewInspectorProxyCalls(this._proxyImpl);
-    dynamic getHitTester(view_tree_token_mojom.ViewTreeToken viewTreeToken,Object hitTester,[Function responseFactory = null]) {
-      var params = new _ViewInspectorGetHitTesterParams();
-      params.viewTreeToken = viewTreeToken;
-      params.hitTester = hitTester;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _viewInspectorMethodGetHitTesterName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    dynamic resolveScenes(List<scene_token_mojom.SceneToken> sceneTokens,[Function responseFactory = null]) {
-      var params = new _ViewInspectorResolveScenesParams();
-      params.sceneTokens = sceneTokens;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _viewInspectorMethodResolveScenesName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-}
-
-
-class ViewInspectorProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  ViewInspector ptr;
-
-  ViewInspectorProxy(_ViewInspectorProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _ViewInspectorProxyCalls(proxyImpl);
-
+class ViewInspectorProxy extends bindings.Proxy
+                              implements ViewInspector {
   ViewInspectorProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _ViewInspectorProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _ViewInspectorProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _ViewInspectorProxyControl.fromEndpoint(endpoint));
 
-  ViewInspectorProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _ViewInspectorProxyImpl.fromHandle(handle) {
-    ptr = new _ViewInspectorProxyCalls(impl);
-  }
+  ViewInspectorProxy.fromHandle(core.MojoHandle handle)
+      : super(new _ViewInspectorProxyControl.fromHandle(handle));
 
-  ViewInspectorProxy.unbound() :
-      impl = new _ViewInspectorProxyImpl.unbound() {
-    ptr = new _ViewInspectorProxyCalls(impl);
+  ViewInspectorProxy.unbound()
+      : super(new _ViewInspectorProxyControl.unbound());
+
+  static ViewInspectorProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ViewInspectorProxy"));
+    return new ViewInspectorProxy.fromEndpoint(endpoint);
   }
 
   factory ViewInspectorProxy.connectToService(
@@ -1246,30 +1177,25 @@
     return p;
   }
 
-  static ViewInspectorProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For ViewInspectorProxy"));
-    return new ViewInspectorProxy.fromEndpoint(endpoint);
+
+  dynamic getHitTester(view_tree_token_mojom.ViewTreeToken viewTreeToken,Object hitTester,[Function responseFactory = null]) {
+    var params = new _ViewInspectorGetHitTesterParams();
+    params.viewTreeToken = viewTreeToken;
+    params.hitTester = hitTester;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _viewInspectorMethodGetHitTesterName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
-
-  String get serviceName => ViewInspector.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "ViewInspectorProxy($impl)";
+  dynamic resolveScenes(List<scene_token_mojom.SceneToken> sceneTokens,[Function responseFactory = null]) {
+    var params = new _ViewInspectorResolveScenesParams();
+    params.sceneTokens = sceneTokens;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _viewInspectorMethodResolveScenesName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
 }
 
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 81aae04..30dd748 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
@@ -725,24 +725,22 @@
 }
 
 
-class _ViewContainerProxyImpl extends bindings.Proxy {
-  _ViewContainerProxyImpl.fromEndpoint(
+class _ViewContainerProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _ViewContainerProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _ViewContainerProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _ViewContainerProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _ViewContainerProxyImpl.unbound() : super.unbound();
-
-  static _ViewContainerProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _ViewContainerProxyImpl"));
-    return new _ViewContainerProxyImpl.fromEndpoint(endpoint);
-  }
+  _ViewContainerProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _ViewContainerServiceDescription();
+      new _ViewContainerServiceDescription();
 
+  String get serviceName => ViewContainer.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -752,82 +750,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_ViewContainerProxyImpl($superString)";
+    return "_ViewContainerProxyControl($superString)";
   }
 }
 
 
-class _ViewContainerProxyCalls implements ViewContainer {
-  _ViewContainerProxyImpl _proxyImpl;
-
-  _ViewContainerProxyCalls(this._proxyImpl);
-    void setListener(Object listener) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _ViewContainerSetListenerParams();
-      params.listener = listener;
-      _proxyImpl.sendMessage(params, _viewContainerMethodSetListenerName);
-    }
-    void addChild(int childKey, Object childViewOwner) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _ViewContainerAddChildParams();
-      params.childKey = childKey;
-      params.childViewOwner = childViewOwner;
-      _proxyImpl.sendMessage(params, _viewContainerMethodAddChildName);
-    }
-    void removeChild(int childKey, Object transferredViewOwner) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _ViewContainerRemoveChildParams();
-      params.childKey = childKey;
-      params.transferredViewOwner = transferredViewOwner;
-      _proxyImpl.sendMessage(params, _viewContainerMethodRemoveChildName);
-    }
-    void setChildProperties(int childKey, int childSceneVersion, view_properties_mojom.ViewProperties childViewProperties) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _ViewContainerSetChildPropertiesParams();
-      params.childKey = childKey;
-      params.childSceneVersion = childSceneVersion;
-      params.childViewProperties = childViewProperties;
-      _proxyImpl.sendMessage(params, _viewContainerMethodSetChildPropertiesName);
-    }
-}
-
-
-class ViewContainerProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  ViewContainer ptr;
-
-  ViewContainerProxy(_ViewContainerProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _ViewContainerProxyCalls(proxyImpl);
-
+class ViewContainerProxy extends bindings.Proxy
+                              implements ViewContainer {
   ViewContainerProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _ViewContainerProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _ViewContainerProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _ViewContainerProxyControl.fromEndpoint(endpoint));
 
-  ViewContainerProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _ViewContainerProxyImpl.fromHandle(handle) {
-    ptr = new _ViewContainerProxyCalls(impl);
-  }
+  ViewContainerProxy.fromHandle(core.MojoHandle handle)
+      : super(new _ViewContainerProxyControl.fromHandle(handle));
 
-  ViewContainerProxy.unbound() :
-      impl = new _ViewContainerProxyImpl.unbound() {
-    ptr = new _ViewContainerProxyCalls(impl);
+  ViewContainerProxy.unbound()
+      : super(new _ViewContainerProxyControl.unbound());
+
+  static ViewContainerProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ViewContainerProxy"));
+    return new ViewContainerProxy.fromEndpoint(endpoint);
   }
 
   factory ViewContainerProxy.connectToService(
@@ -837,30 +783,50 @@
     return p;
   }
 
-  static ViewContainerProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For ViewContainerProxy"));
-    return new ViewContainerProxy.fromEndpoint(endpoint);
+
+  void setListener(Object listener) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _ViewContainerSetListenerParams();
+    params.listener = listener;
+    ctrl.sendMessage(params,
+        _viewContainerMethodSetListenerName);
   }
-
-  String get serviceName => ViewContainer.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
+  void addChild(int childKey, Object childViewOwner) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _ViewContainerAddChildParams();
+    params.childKey = childKey;
+    params.childViewOwner = childViewOwner;
+    ctrl.sendMessage(params,
+        _viewContainerMethodAddChildName);
   }
-
-  String toString() {
-    return "ViewContainerProxy($impl)";
+  void removeChild(int childKey, Object transferredViewOwner) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _ViewContainerRemoveChildParams();
+    params.childKey = childKey;
+    params.transferredViewOwner = transferredViewOwner;
+    ctrl.sendMessage(params,
+        _viewContainerMethodRemoveChildName);
+  }
+  void setChildProperties(int childKey, int childSceneVersion, view_properties_mojom.ViewProperties childViewProperties) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _ViewContainerSetChildPropertiesParams();
+    params.childKey = childKey;
+    params.childSceneVersion = childSceneVersion;
+    params.childViewProperties = childViewProperties;
+    ctrl.sendMessage(params,
+        _viewContainerMethodSetChildPropertiesName);
   }
 }
 
@@ -983,24 +949,22 @@
 }
 
 
-class _ViewContainerListenerProxyImpl extends bindings.Proxy {
-  _ViewContainerListenerProxyImpl.fromEndpoint(
+class _ViewContainerListenerProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _ViewContainerListenerProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _ViewContainerListenerProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _ViewContainerListenerProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _ViewContainerListenerProxyImpl.unbound() : super.unbound();
-
-  static _ViewContainerListenerProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _ViewContainerListenerProxyImpl"));
-    return new _ViewContainerListenerProxyImpl.fromEndpoint(endpoint);
-  }
+  _ViewContainerListenerProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _ViewContainerListenerServiceDescription();
+      new _ViewContainerListenerServiceDescription();
 
+  String get serviceName => ViewContainerListener.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _viewContainerListenerMethodOnChildAttachedName:
@@ -1050,61 +1014,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_ViewContainerListenerProxyImpl($superString)";
+    return "_ViewContainerListenerProxyControl($superString)";
   }
 }
 
 
-class _ViewContainerListenerProxyCalls implements ViewContainerListener {
-  _ViewContainerListenerProxyImpl _proxyImpl;
-
-  _ViewContainerListenerProxyCalls(this._proxyImpl);
-    dynamic onChildAttached(int childKey,ViewInfo childViewInfo,[Function responseFactory = null]) {
-      var params = new _ViewContainerListenerOnChildAttachedParams();
-      params.childKey = childKey;
-      params.childViewInfo = childViewInfo;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _viewContainerListenerMethodOnChildAttachedName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    dynamic onChildUnavailable(int childKey,[Function responseFactory = null]) {
-      var params = new _ViewContainerListenerOnChildUnavailableParams();
-      params.childKey = childKey;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _viewContainerListenerMethodOnChildUnavailableName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-}
-
-
-class ViewContainerListenerProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  ViewContainerListener ptr;
-
-  ViewContainerListenerProxy(_ViewContainerListenerProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _ViewContainerListenerProxyCalls(proxyImpl);
-
+class ViewContainerListenerProxy extends bindings.Proxy
+                              implements ViewContainerListener {
   ViewContainerListenerProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _ViewContainerListenerProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _ViewContainerListenerProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _ViewContainerListenerProxyControl.fromEndpoint(endpoint));
 
-  ViewContainerListenerProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _ViewContainerListenerProxyImpl.fromHandle(handle) {
-    ptr = new _ViewContainerListenerProxyCalls(impl);
-  }
+  ViewContainerListenerProxy.fromHandle(core.MojoHandle handle)
+      : super(new _ViewContainerListenerProxyControl.fromHandle(handle));
 
-  ViewContainerListenerProxy.unbound() :
-      impl = new _ViewContainerListenerProxyImpl.unbound() {
-    ptr = new _ViewContainerListenerProxyCalls(impl);
+  ViewContainerListenerProxy.unbound()
+      : super(new _ViewContainerListenerProxyControl.unbound());
+
+  static ViewContainerListenerProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ViewContainerListenerProxy"));
+    return new ViewContainerListenerProxy.fromEndpoint(endpoint);
   }
 
   factory ViewContainerListenerProxy.connectToService(
@@ -1114,30 +1047,25 @@
     return p;
   }
 
-  static ViewContainerListenerProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For ViewContainerListenerProxy"));
-    return new ViewContainerListenerProxy.fromEndpoint(endpoint);
+
+  dynamic onChildAttached(int childKey,ViewInfo childViewInfo,[Function responseFactory = null]) {
+    var params = new _ViewContainerListenerOnChildAttachedParams();
+    params.childKey = childKey;
+    params.childViewInfo = childViewInfo;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _viewContainerListenerMethodOnChildAttachedName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
-
-  String get serviceName => ViewContainerListener.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "ViewContainerListenerProxy($impl)";
+  dynamic onChildUnavailable(int childKey,[Function responseFactory = null]) {
+    var params = new _ViewContainerListenerOnChildUnavailableParams();
+    params.childKey = childKey;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _viewContainerListenerMethodOnChildUnavailableName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
 }
 
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 f97e1e3..92e814e 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
@@ -241,24 +241,22 @@
 }
 
 
-class _ViewManagerProxyImpl extends bindings.Proxy {
-  _ViewManagerProxyImpl.fromEndpoint(
+class _ViewManagerProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _ViewManagerProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _ViewManagerProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _ViewManagerProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _ViewManagerProxyImpl.unbound() : super.unbound();
-
-  static _ViewManagerProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _ViewManagerProxyImpl"));
-    return new _ViewManagerProxyImpl.fromEndpoint(endpoint);
-  }
+  _ViewManagerProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _ViewManagerServiceDescription();
+      new _ViewManagerServiceDescription();
 
+  String get serviceName => ViewManager.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -268,65 +266,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_ViewManagerProxyImpl($superString)";
+    return "_ViewManagerProxyControl($superString)";
   }
 }
 
 
-class _ViewManagerProxyCalls implements ViewManager {
-  _ViewManagerProxyImpl _proxyImpl;
-
-  _ViewManagerProxyCalls(this._proxyImpl);
-    void createView(Object view, Object viewOwner, Object viewListener, String label) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _ViewManagerCreateViewParams();
-      params.view = view;
-      params.viewOwner = viewOwner;
-      params.viewListener = viewListener;
-      params.label = label;
-      _proxyImpl.sendMessage(params, _viewManagerMethodCreateViewName);
-    }
-    void createViewTree(Object viewTree, Object viewTreeListener, String label) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _ViewManagerCreateViewTreeParams();
-      params.viewTree = viewTree;
-      params.viewTreeListener = viewTreeListener;
-      params.label = label;
-      _proxyImpl.sendMessage(params, _viewManagerMethodCreateViewTreeName);
-    }
-}
-
-
-class ViewManagerProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  ViewManager ptr;
-
-  ViewManagerProxy(_ViewManagerProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _ViewManagerProxyCalls(proxyImpl);
-
+class ViewManagerProxy extends bindings.Proxy
+                              implements ViewManager {
   ViewManagerProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _ViewManagerProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _ViewManagerProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _ViewManagerProxyControl.fromEndpoint(endpoint));
 
-  ViewManagerProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _ViewManagerProxyImpl.fromHandle(handle) {
-    ptr = new _ViewManagerProxyCalls(impl);
-  }
+  ViewManagerProxy.fromHandle(core.MojoHandle handle)
+      : super(new _ViewManagerProxyControl.fromHandle(handle));
 
-  ViewManagerProxy.unbound() :
-      impl = new _ViewManagerProxyImpl.unbound() {
-    ptr = new _ViewManagerProxyCalls(impl);
+  ViewManagerProxy.unbound()
+      : super(new _ViewManagerProxyControl.unbound());
+
+  static ViewManagerProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ViewManagerProxy"));
+    return new ViewManagerProxy.fromEndpoint(endpoint);
   }
 
   factory ViewManagerProxy.connectToService(
@@ -336,30 +299,31 @@
     return p;
   }
 
-  static ViewManagerProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For ViewManagerProxy"));
-    return new ViewManagerProxy.fromEndpoint(endpoint);
+
+  void createView(Object view, Object viewOwner, Object viewListener, String label) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _ViewManagerCreateViewParams();
+    params.view = view;
+    params.viewOwner = viewOwner;
+    params.viewListener = viewListener;
+    params.label = label;
+    ctrl.sendMessage(params,
+        _viewManagerMethodCreateViewName);
   }
-
-  String get serviceName => ViewManager.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "ViewManagerProxy($impl)";
+  void createViewTree(Object viewTree, Object viewTreeListener, String label) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _ViewManagerCreateViewTreeParams();
+    params.viewTree = viewTree;
+    params.viewTreeListener = viewTreeListener;
+    params.label = label;
+    ctrl.sendMessage(params,
+        _viewManagerMethodCreateViewTreeName);
   }
 }
 
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 d21715d..21619b8 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
@@ -127,24 +127,22 @@
 }
 
 
-class _ViewProviderProxyImpl extends bindings.Proxy {
-  _ViewProviderProxyImpl.fromEndpoint(
+class _ViewProviderProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _ViewProviderProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _ViewProviderProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _ViewProviderProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _ViewProviderProxyImpl.unbound() : super.unbound();
-
-  static _ViewProviderProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _ViewProviderProxyImpl"));
-    return new _ViewProviderProxyImpl.fromEndpoint(endpoint);
-  }
+  _ViewProviderProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _ViewProviderServiceDescription();
+      new _ViewProviderServiceDescription();
 
+  String get serviceName => ViewProvider.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -154,53 +152,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_ViewProviderProxyImpl($superString)";
+    return "_ViewProviderProxyControl($superString)";
   }
 }
 
 
-class _ViewProviderProxyCalls implements ViewProvider {
-  _ViewProviderProxyImpl _proxyImpl;
-
-  _ViewProviderProxyCalls(this._proxyImpl);
-    void createView(Object viewOwner, Object services, Object exposedServices) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _ViewProviderCreateViewParams();
-      params.viewOwner = viewOwner;
-      params.services = services;
-      params.exposedServices = exposedServices;
-      _proxyImpl.sendMessage(params, _viewProviderMethodCreateViewName);
-    }
-}
-
-
-class ViewProviderProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  ViewProvider ptr;
-
-  ViewProviderProxy(_ViewProviderProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _ViewProviderProxyCalls(proxyImpl);
-
+class ViewProviderProxy extends bindings.Proxy
+                              implements ViewProvider {
   ViewProviderProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _ViewProviderProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _ViewProviderProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _ViewProviderProxyControl.fromEndpoint(endpoint));
 
-  ViewProviderProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _ViewProviderProxyImpl.fromHandle(handle) {
-    ptr = new _ViewProviderProxyCalls(impl);
-  }
+  ViewProviderProxy.fromHandle(core.MojoHandle handle)
+      : super(new _ViewProviderProxyControl.fromHandle(handle));
 
-  ViewProviderProxy.unbound() :
-      impl = new _ViewProviderProxyImpl.unbound() {
-    ptr = new _ViewProviderProxyCalls(impl);
+  ViewProviderProxy.unbound()
+      : super(new _ViewProviderProxyControl.unbound());
+
+  static ViewProviderProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ViewProviderProxy"));
+    return new ViewProviderProxy.fromEndpoint(endpoint);
   }
 
   factory ViewProviderProxy.connectToService(
@@ -210,30 +185,18 @@
     return p;
   }
 
-  static ViewProviderProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For ViewProviderProxy"));
-    return new ViewProviderProxy.fromEndpoint(endpoint);
-  }
 
-  String get serviceName => ViewProvider.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "ViewProviderProxy($impl)";
+  void createView(Object viewOwner, Object services, Object exposedServices) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _ViewProviderCreateViewParams();
+    params.viewOwner = viewOwner;
+    params.services = services;
+    params.exposedServices = exposedServices;
+    ctrl.sendMessage(params,
+        _viewProviderMethodCreateViewName);
   }
 }
 
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 10a3104..125ef8f 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
@@ -231,24 +231,22 @@
 }
 
 
-class _ViewOwnerProxyImpl extends bindings.Proxy {
-  _ViewOwnerProxyImpl.fromEndpoint(
+class _ViewOwnerProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _ViewOwnerProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _ViewOwnerProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _ViewOwnerProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _ViewOwnerProxyImpl.unbound() : super.unbound();
-
-  static _ViewOwnerProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _ViewOwnerProxyImpl"));
-    return new _ViewOwnerProxyImpl.fromEndpoint(endpoint);
-  }
+  _ViewOwnerProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _ViewOwnerServiceDescription();
+      new _ViewOwnerServiceDescription();
 
+  String get serviceName => ViewOwner.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _viewOwnerMethodGetTokenName:
@@ -278,50 +276,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_ViewOwnerProxyImpl($superString)";
+    return "_ViewOwnerProxyControl($superString)";
   }
 }
 
 
-class _ViewOwnerProxyCalls implements ViewOwner {
-  _ViewOwnerProxyImpl _proxyImpl;
-
-  _ViewOwnerProxyCalls(this._proxyImpl);
-    dynamic getToken([Function responseFactory = null]) {
-      var params = new _ViewOwnerGetTokenParams();
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _viewOwnerMethodGetTokenName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-}
-
-
-class ViewOwnerProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  ViewOwner ptr;
-
-  ViewOwnerProxy(_ViewOwnerProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _ViewOwnerProxyCalls(proxyImpl);
-
+class ViewOwnerProxy extends bindings.Proxy
+                              implements ViewOwner {
   ViewOwnerProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _ViewOwnerProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _ViewOwnerProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _ViewOwnerProxyControl.fromEndpoint(endpoint));
 
-  ViewOwnerProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _ViewOwnerProxyImpl.fromHandle(handle) {
-    ptr = new _ViewOwnerProxyCalls(impl);
-  }
+  ViewOwnerProxy.fromHandle(core.MojoHandle handle)
+      : super(new _ViewOwnerProxyControl.fromHandle(handle));
 
-  ViewOwnerProxy.unbound() :
-      impl = new _ViewOwnerProxyImpl.unbound() {
-    ptr = new _ViewOwnerProxyCalls(impl);
+  ViewOwnerProxy.unbound()
+      : super(new _ViewOwnerProxyControl.unbound());
+
+  static ViewOwnerProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ViewOwnerProxy"));
+    return new ViewOwnerProxy.fromEndpoint(endpoint);
   }
 
   factory ViewOwnerProxy.connectToService(
@@ -331,30 +309,14 @@
     return p;
   }
 
-  static ViewOwnerProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For ViewOwnerProxy"));
-    return new ViewOwnerProxy.fromEndpoint(endpoint);
-  }
 
-  String get serviceName => ViewOwner.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "ViewOwnerProxy($impl)";
+  dynamic getToken([Function responseFactory = null]) {
+    var params = new _ViewOwnerGetTokenParams();
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _viewOwnerMethodGetTokenName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
 }
 
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 7877c3b..78bef26 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
@@ -498,24 +498,22 @@
 }
 
 
-class _ViewTreeProxyImpl extends bindings.Proxy {
-  _ViewTreeProxyImpl.fromEndpoint(
+class _ViewTreeProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _ViewTreeProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _ViewTreeProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _ViewTreeProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _ViewTreeProxyImpl.unbound() : super.unbound();
-
-  static _ViewTreeProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _ViewTreeProxyImpl"));
-    return new _ViewTreeProxyImpl.fromEndpoint(endpoint);
-  }
+  _ViewTreeProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _ViewTreeServiceDescription();
+      new _ViewTreeServiceDescription();
 
+  String get serviceName => ViewTree.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _viewTreeMethodGetTokenName:
@@ -545,77 +543,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_ViewTreeProxyImpl($superString)";
+    return "_ViewTreeProxyControl($superString)";
   }
 }
 
 
-class _ViewTreeProxyCalls implements ViewTree {
-  _ViewTreeProxyImpl _proxyImpl;
-
-  _ViewTreeProxyCalls(this._proxyImpl);
-    dynamic getToken([Function responseFactory = null]) {
-      var params = new _ViewTreeGetTokenParams();
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _viewTreeMethodGetTokenName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    void getServiceProvider(Object serviceProvider) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _ViewTreeGetServiceProviderParams();
-      params.serviceProvider = serviceProvider;
-      _proxyImpl.sendMessage(params, _viewTreeMethodGetServiceProviderName);
-    }
-    void setRenderer(Object renderer) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _ViewTreeSetRendererParams();
-      params.renderer = renderer;
-      _proxyImpl.sendMessage(params, _viewTreeMethodSetRendererName);
-    }
-    void getContainer(Object container) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _ViewTreeGetContainerParams();
-      params.container = container;
-      _proxyImpl.sendMessage(params, _viewTreeMethodGetContainerName);
-    }
-}
-
-
-class ViewTreeProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  ViewTree ptr;
-
-  ViewTreeProxy(_ViewTreeProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _ViewTreeProxyCalls(proxyImpl);
-
+class ViewTreeProxy extends bindings.Proxy
+                              implements ViewTree {
   ViewTreeProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _ViewTreeProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _ViewTreeProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _ViewTreeProxyControl.fromEndpoint(endpoint));
 
-  ViewTreeProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _ViewTreeProxyImpl.fromHandle(handle) {
-    ptr = new _ViewTreeProxyCalls(impl);
-  }
+  ViewTreeProxy.fromHandle(core.MojoHandle handle)
+      : super(new _ViewTreeProxyControl.fromHandle(handle));
 
-  ViewTreeProxy.unbound() :
-      impl = new _ViewTreeProxyImpl.unbound() {
-    ptr = new _ViewTreeProxyCalls(impl);
+  ViewTreeProxy.unbound()
+      : super(new _ViewTreeProxyControl.unbound());
+
+  static ViewTreeProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ViewTreeProxy"));
+    return new ViewTreeProxy.fromEndpoint(endpoint);
   }
 
   factory ViewTreeProxy.connectToService(
@@ -625,30 +576,44 @@
     return p;
   }
 
-  static ViewTreeProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For ViewTreeProxy"));
-    return new ViewTreeProxy.fromEndpoint(endpoint);
+
+  dynamic getToken([Function responseFactory = null]) {
+    var params = new _ViewTreeGetTokenParams();
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _viewTreeMethodGetTokenName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
-
-  String get serviceName => ViewTree.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
+  void getServiceProvider(Object serviceProvider) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _ViewTreeGetServiceProviderParams();
+    params.serviceProvider = serviceProvider;
+    ctrl.sendMessage(params,
+        _viewTreeMethodGetServiceProviderName);
   }
-
-  String toString() {
-    return "ViewTreeProxy($impl)";
+  void setRenderer(Object renderer) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _ViewTreeSetRendererParams();
+    params.renderer = renderer;
+    ctrl.sendMessage(params,
+        _viewTreeMethodSetRendererName);
+  }
+  void getContainer(Object container) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _ViewTreeGetContainerParams();
+    params.container = container;
+    ctrl.sendMessage(params,
+        _viewTreeMethodGetContainerName);
   }
 }
 
@@ -789,24 +754,22 @@
 }
 
 
-class _ViewTreeListenerProxyImpl extends bindings.Proxy {
-  _ViewTreeListenerProxyImpl.fromEndpoint(
+class _ViewTreeListenerProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _ViewTreeListenerProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _ViewTreeListenerProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _ViewTreeListenerProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _ViewTreeListenerProxyImpl.unbound() : super.unbound();
-
-  static _ViewTreeListenerProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _ViewTreeListenerProxyImpl"));
-    return new _ViewTreeListenerProxyImpl.fromEndpoint(endpoint);
-  }
+  _ViewTreeListenerProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _ViewTreeListenerServiceDescription();
+      new _ViewTreeListenerServiceDescription();
 
+  String get serviceName => ViewTreeListener.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _viewTreeListenerMethodOnRendererDiedName:
@@ -836,50 +799,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_ViewTreeListenerProxyImpl($superString)";
+    return "_ViewTreeListenerProxyControl($superString)";
   }
 }
 
 
-class _ViewTreeListenerProxyCalls implements ViewTreeListener {
-  _ViewTreeListenerProxyImpl _proxyImpl;
-
-  _ViewTreeListenerProxyCalls(this._proxyImpl);
-    dynamic onRendererDied([Function responseFactory = null]) {
-      var params = new _ViewTreeListenerOnRendererDiedParams();
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _viewTreeListenerMethodOnRendererDiedName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-}
-
-
-class ViewTreeListenerProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  ViewTreeListener ptr;
-
-  ViewTreeListenerProxy(_ViewTreeListenerProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _ViewTreeListenerProxyCalls(proxyImpl);
-
+class ViewTreeListenerProxy extends bindings.Proxy
+                              implements ViewTreeListener {
   ViewTreeListenerProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _ViewTreeListenerProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _ViewTreeListenerProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _ViewTreeListenerProxyControl.fromEndpoint(endpoint));
 
-  ViewTreeListenerProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _ViewTreeListenerProxyImpl.fromHandle(handle) {
-    ptr = new _ViewTreeListenerProxyCalls(impl);
-  }
+  ViewTreeListenerProxy.fromHandle(core.MojoHandle handle)
+      : super(new _ViewTreeListenerProxyControl.fromHandle(handle));
 
-  ViewTreeListenerProxy.unbound() :
-      impl = new _ViewTreeListenerProxyImpl.unbound() {
-    ptr = new _ViewTreeListenerProxyCalls(impl);
+  ViewTreeListenerProxy.unbound()
+      : super(new _ViewTreeListenerProxyControl.unbound());
+
+  static ViewTreeListenerProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ViewTreeListenerProxy"));
+    return new ViewTreeListenerProxy.fromEndpoint(endpoint);
   }
 
   factory ViewTreeListenerProxy.connectToService(
@@ -889,30 +832,14 @@
     return p;
   }
 
-  static ViewTreeListenerProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For ViewTreeListenerProxy"));
-    return new ViewTreeListenerProxy.fromEndpoint(endpoint);
-  }
 
-  String get serviceName => ViewTreeListener.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "ViewTreeListenerProxy($impl)";
+  dynamic onRendererDied([Function responseFactory = null]) {
+    var params = new _ViewTreeListenerOnRendererDiedParams();
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _viewTreeListenerMethodOnRendererDiedName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
 }
 
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 007b965..9b930a6 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
@@ -528,24 +528,22 @@
 }
 
 
-class _ViewProxyImpl extends bindings.Proxy {
-  _ViewProxyImpl.fromEndpoint(
+class _ViewProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _ViewProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _ViewProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _ViewProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _ViewProxyImpl.unbound() : super.unbound();
-
-  static _ViewProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _ViewProxyImpl"));
-    return new _ViewProxyImpl.fromEndpoint(endpoint);
-  }
+  _ViewProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _ViewServiceDescription();
+      new _ViewServiceDescription();
 
+  String get serviceName => View.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _viewMethodGetTokenName:
@@ -575,77 +573,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_ViewProxyImpl($superString)";
+    return "_ViewProxyControl($superString)";
   }
 }
 
 
-class _ViewProxyCalls implements View {
-  _ViewProxyImpl _proxyImpl;
-
-  _ViewProxyCalls(this._proxyImpl);
-    dynamic getToken([Function responseFactory = null]) {
-      var params = new _ViewGetTokenParams();
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _viewMethodGetTokenName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    void getServiceProvider(Object serviceProvider) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _ViewGetServiceProviderParams();
-      params.serviceProvider = serviceProvider;
-      _proxyImpl.sendMessage(params, _viewMethodGetServiceProviderName);
-    }
-    void createScene(Object scene) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _ViewCreateSceneParams();
-      params.scene = scene;
-      _proxyImpl.sendMessage(params, _viewMethodCreateSceneName);
-    }
-    void getContainer(Object container) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _ViewGetContainerParams();
-      params.container = container;
-      _proxyImpl.sendMessage(params, _viewMethodGetContainerName);
-    }
-}
-
-
-class ViewProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  View ptr;
-
-  ViewProxy(_ViewProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _ViewProxyCalls(proxyImpl);
-
+class ViewProxy extends bindings.Proxy
+                              implements View {
   ViewProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _ViewProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _ViewProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _ViewProxyControl.fromEndpoint(endpoint));
 
-  ViewProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _ViewProxyImpl.fromHandle(handle) {
-    ptr = new _ViewProxyCalls(impl);
-  }
+  ViewProxy.fromHandle(core.MojoHandle handle)
+      : super(new _ViewProxyControl.fromHandle(handle));
 
-  ViewProxy.unbound() :
-      impl = new _ViewProxyImpl.unbound() {
-    ptr = new _ViewProxyCalls(impl);
+  ViewProxy.unbound()
+      : super(new _ViewProxyControl.unbound());
+
+  static ViewProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ViewProxy"));
+    return new ViewProxy.fromEndpoint(endpoint);
   }
 
   factory ViewProxy.connectToService(
@@ -655,30 +606,44 @@
     return p;
   }
 
-  static ViewProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For ViewProxy"));
-    return new ViewProxy.fromEndpoint(endpoint);
+
+  dynamic getToken([Function responseFactory = null]) {
+    var params = new _ViewGetTokenParams();
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _viewMethodGetTokenName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
-
-  String get serviceName => View.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
+  void getServiceProvider(Object serviceProvider) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _ViewGetServiceProviderParams();
+    params.serviceProvider = serviceProvider;
+    ctrl.sendMessage(params,
+        _viewMethodGetServiceProviderName);
   }
-
-  String toString() {
-    return "ViewProxy($impl)";
+  void createScene(Object scene) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _ViewCreateSceneParams();
+    params.scene = scene;
+    ctrl.sendMessage(params,
+        _viewMethodCreateSceneName);
+  }
+  void getContainer(Object container) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _ViewGetContainerParams();
+    params.container = container;
+    ctrl.sendMessage(params,
+        _viewMethodGetContainerName);
   }
 }
 
@@ -819,24 +784,22 @@
 }
 
 
-class _ViewListenerProxyImpl extends bindings.Proxy {
-  _ViewListenerProxyImpl.fromEndpoint(
+class _ViewListenerProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _ViewListenerProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _ViewListenerProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _ViewListenerProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _ViewListenerProxyImpl.unbound() : super.unbound();
-
-  static _ViewListenerProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _ViewListenerProxyImpl"));
-    return new _ViewListenerProxyImpl.fromEndpoint(endpoint);
-  }
+  _ViewListenerProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _ViewListenerServiceDescription();
+      new _ViewListenerServiceDescription();
 
+  String get serviceName => ViewListener.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _viewListenerMethodOnPropertiesChangedName:
@@ -866,52 +829,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_ViewListenerProxyImpl($superString)";
+    return "_ViewListenerProxyControl($superString)";
   }
 }
 
 
-class _ViewListenerProxyCalls implements ViewListener {
-  _ViewListenerProxyImpl _proxyImpl;
-
-  _ViewListenerProxyCalls(this._proxyImpl);
-    dynamic onPropertiesChanged(int sceneVersion,view_properties_mojom.ViewProperties properties,[Function responseFactory = null]) {
-      var params = new _ViewListenerOnPropertiesChangedParams();
-      params.sceneVersion = sceneVersion;
-      params.properties = properties;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _viewListenerMethodOnPropertiesChangedName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-}
-
-
-class ViewListenerProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  ViewListener ptr;
-
-  ViewListenerProxy(_ViewListenerProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _ViewListenerProxyCalls(proxyImpl);
-
+class ViewListenerProxy extends bindings.Proxy
+                              implements ViewListener {
   ViewListenerProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _ViewListenerProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _ViewListenerProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _ViewListenerProxyControl.fromEndpoint(endpoint));
 
-  ViewListenerProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _ViewListenerProxyImpl.fromHandle(handle) {
-    ptr = new _ViewListenerProxyCalls(impl);
-  }
+  ViewListenerProxy.fromHandle(core.MojoHandle handle)
+      : super(new _ViewListenerProxyControl.fromHandle(handle));
 
-  ViewListenerProxy.unbound() :
-      impl = new _ViewListenerProxyImpl.unbound() {
-    ptr = new _ViewListenerProxyCalls(impl);
+  ViewListenerProxy.unbound()
+      : super(new _ViewListenerProxyControl.unbound());
+
+  static ViewListenerProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ViewListenerProxy"));
+    return new ViewListenerProxy.fromEndpoint(endpoint);
   }
 
   factory ViewListenerProxy.connectToService(
@@ -921,30 +862,16 @@
     return p;
   }
 
-  static ViewListenerProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For ViewListenerProxy"));
-    return new ViewListenerProxy.fromEndpoint(endpoint);
-  }
 
-  String get serviceName => ViewListener.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "ViewListenerProxy($impl)";
+  dynamic onPropertiesChanged(int sceneVersion,view_properties_mojom.ViewProperties properties,[Function responseFactory = null]) {
+    var params = new _ViewListenerOnPropertiesChangedParams();
+    params.sceneVersion = sceneVersion;
+    params.properties = properties;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _viewListenerMethodOnPropertiesChangedName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
 }
 
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 49e3b48..3aa88cd 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
@@ -527,24 +527,22 @@
 }
 
 
-class _UrlLoaderProxyImpl extends bindings.Proxy {
-  _UrlLoaderProxyImpl.fromEndpoint(
+class _UrlLoaderProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _UrlLoaderProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _UrlLoaderProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _UrlLoaderProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _UrlLoaderProxyImpl.unbound() : super.unbound();
-
-  static _UrlLoaderProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _UrlLoaderProxyImpl"));
-    return new _UrlLoaderProxyImpl.fromEndpoint(endpoint);
-  }
+  _UrlLoaderProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _UrlLoaderServiceDescription();
+      new _UrlLoaderServiceDescription();
 
+  String get serviceName => UrlLoader.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _urlLoaderMethodStartName:
@@ -614,67 +612,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_UrlLoaderProxyImpl($superString)";
+    return "_UrlLoaderProxyControl($superString)";
   }
 }
 
 
-class _UrlLoaderProxyCalls implements UrlLoader {
-  _UrlLoaderProxyImpl _proxyImpl;
-
-  _UrlLoaderProxyCalls(this._proxyImpl);
-    dynamic start(url_request_mojom.UrlRequest request,[Function responseFactory = null]) {
-      var params = new _UrlLoaderStartParams();
-      params.request = request;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _urlLoaderMethodStartName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    dynamic followRedirect([Function responseFactory = null]) {
-      var params = new _UrlLoaderFollowRedirectParams();
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _urlLoaderMethodFollowRedirectName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    dynamic queryStatus([Function responseFactory = null]) {
-      var params = new _UrlLoaderQueryStatusParams();
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _urlLoaderMethodQueryStatusName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-}
-
-
-class UrlLoaderProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  UrlLoader ptr;
-
-  UrlLoaderProxy(_UrlLoaderProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _UrlLoaderProxyCalls(proxyImpl);
-
+class UrlLoaderProxy extends bindings.Proxy
+                              implements UrlLoader {
   UrlLoaderProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _UrlLoaderProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _UrlLoaderProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _UrlLoaderProxyControl.fromEndpoint(endpoint));
 
-  UrlLoaderProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _UrlLoaderProxyImpl.fromHandle(handle) {
-    ptr = new _UrlLoaderProxyCalls(impl);
-  }
+  UrlLoaderProxy.fromHandle(core.MojoHandle handle)
+      : super(new _UrlLoaderProxyControl.fromHandle(handle));
 
-  UrlLoaderProxy.unbound() :
-      impl = new _UrlLoaderProxyImpl.unbound() {
-    ptr = new _UrlLoaderProxyCalls(impl);
+  UrlLoaderProxy.unbound()
+      : super(new _UrlLoaderProxyControl.unbound());
+
+  static UrlLoaderProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For UrlLoaderProxy"));
+    return new UrlLoaderProxy.fromEndpoint(endpoint);
   }
 
   factory UrlLoaderProxy.connectToService(
@@ -684,30 +645,31 @@
     return p;
   }
 
-  static UrlLoaderProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For UrlLoaderProxy"));
-    return new UrlLoaderProxy.fromEndpoint(endpoint);
+
+  dynamic start(url_request_mojom.UrlRequest request,[Function responseFactory = null]) {
+    var params = new _UrlLoaderStartParams();
+    params.request = request;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _urlLoaderMethodStartName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
-
-  String get serviceName => UrlLoader.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
+  dynamic followRedirect([Function responseFactory = null]) {
+    var params = new _UrlLoaderFollowRedirectParams();
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _urlLoaderMethodFollowRedirectName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
-
-  String toString() {
-    return "UrlLoaderProxy($impl)";
+  dynamic queryStatus([Function responseFactory = null]) {
+    var params = new _UrlLoaderQueryStatusParams();
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _urlLoaderMethodQueryStatusName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
 }
 
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 66dfb1d..d78a30f 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
@@ -605,24 +605,22 @@
 }
 
 
-class _UrlLoaderInterceptorFactoryProxyImpl extends bindings.Proxy {
-  _UrlLoaderInterceptorFactoryProxyImpl.fromEndpoint(
+class _UrlLoaderInterceptorFactoryProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _UrlLoaderInterceptorFactoryProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _UrlLoaderInterceptorFactoryProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _UrlLoaderInterceptorFactoryProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _UrlLoaderInterceptorFactoryProxyImpl.unbound() : super.unbound();
-
-  static _UrlLoaderInterceptorFactoryProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _UrlLoaderInterceptorFactoryProxyImpl"));
-    return new _UrlLoaderInterceptorFactoryProxyImpl.fromEndpoint(endpoint);
-  }
+  _UrlLoaderInterceptorFactoryProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _UrlLoaderInterceptorFactoryServiceDescription();
+      new _UrlLoaderInterceptorFactoryServiceDescription();
 
+  String get serviceName => UrlLoaderInterceptorFactory.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -632,51 +630,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_UrlLoaderInterceptorFactoryProxyImpl($superString)";
+    return "_UrlLoaderInterceptorFactoryProxyControl($superString)";
   }
 }
 
 
-class _UrlLoaderInterceptorFactoryProxyCalls implements UrlLoaderInterceptorFactory {
-  _UrlLoaderInterceptorFactoryProxyImpl _proxyImpl;
-
-  _UrlLoaderInterceptorFactoryProxyCalls(this._proxyImpl);
-    void create(Object interceptor) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _UrlLoaderInterceptorFactoryCreateParams();
-      params.interceptor = interceptor;
-      _proxyImpl.sendMessage(params, _urlLoaderInterceptorFactoryMethodCreateName);
-    }
-}
-
-
-class UrlLoaderInterceptorFactoryProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  UrlLoaderInterceptorFactory ptr;
-
-  UrlLoaderInterceptorFactoryProxy(_UrlLoaderInterceptorFactoryProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _UrlLoaderInterceptorFactoryProxyCalls(proxyImpl);
-
+class UrlLoaderInterceptorFactoryProxy extends bindings.Proxy
+                              implements UrlLoaderInterceptorFactory {
   UrlLoaderInterceptorFactoryProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _UrlLoaderInterceptorFactoryProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _UrlLoaderInterceptorFactoryProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _UrlLoaderInterceptorFactoryProxyControl.fromEndpoint(endpoint));
 
-  UrlLoaderInterceptorFactoryProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _UrlLoaderInterceptorFactoryProxyImpl.fromHandle(handle) {
-    ptr = new _UrlLoaderInterceptorFactoryProxyCalls(impl);
-  }
+  UrlLoaderInterceptorFactoryProxy.fromHandle(core.MojoHandle handle)
+      : super(new _UrlLoaderInterceptorFactoryProxyControl.fromHandle(handle));
 
-  UrlLoaderInterceptorFactoryProxy.unbound() :
-      impl = new _UrlLoaderInterceptorFactoryProxyImpl.unbound() {
-    ptr = new _UrlLoaderInterceptorFactoryProxyCalls(impl);
+  UrlLoaderInterceptorFactoryProxy.unbound()
+      : super(new _UrlLoaderInterceptorFactoryProxyControl.unbound());
+
+  static UrlLoaderInterceptorFactoryProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For UrlLoaderInterceptorFactoryProxy"));
+    return new UrlLoaderInterceptorFactoryProxy.fromEndpoint(endpoint);
   }
 
   factory UrlLoaderInterceptorFactoryProxy.connectToService(
@@ -686,30 +663,16 @@
     return p;
   }
 
-  static UrlLoaderInterceptorFactoryProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For UrlLoaderInterceptorFactoryProxy"));
-    return new UrlLoaderInterceptorFactoryProxy.fromEndpoint(endpoint);
-  }
 
-  String get serviceName => UrlLoaderInterceptorFactory.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "UrlLoaderInterceptorFactoryProxy($impl)";
+  void create(Object interceptor) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _UrlLoaderInterceptorFactoryCreateParams();
+    params.interceptor = interceptor;
+    ctrl.sendMessage(params,
+        _urlLoaderInterceptorFactoryMethodCreateName);
   }
 }
 
@@ -819,24 +782,22 @@
 }
 
 
-class _UrlLoaderInterceptorProxyImpl extends bindings.Proxy {
-  _UrlLoaderInterceptorProxyImpl.fromEndpoint(
+class _UrlLoaderInterceptorProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _UrlLoaderInterceptorProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _UrlLoaderInterceptorProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _UrlLoaderInterceptorProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _UrlLoaderInterceptorProxyImpl.unbound() : super.unbound();
-
-  static _UrlLoaderInterceptorProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _UrlLoaderInterceptorProxyImpl"));
-    return new _UrlLoaderInterceptorProxyImpl.fromEndpoint(endpoint);
-  }
+  _UrlLoaderInterceptorProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _UrlLoaderInterceptorServiceDescription();
+      new _UrlLoaderInterceptorServiceDescription();
 
+  String get serviceName => UrlLoaderInterceptor.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _urlLoaderInterceptorMethodInterceptRequestName:
@@ -906,68 +867,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_UrlLoaderInterceptorProxyImpl($superString)";
+    return "_UrlLoaderInterceptorProxyControl($superString)";
   }
 }
 
 
-class _UrlLoaderInterceptorProxyCalls implements UrlLoaderInterceptor {
-  _UrlLoaderInterceptorProxyImpl _proxyImpl;
-
-  _UrlLoaderInterceptorProxyCalls(this._proxyImpl);
-    dynamic interceptRequest(url_request_mojom.UrlRequest request,[Function responseFactory = null]) {
-      var params = new _UrlLoaderInterceptorInterceptRequestParams();
-      params.request = request;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _urlLoaderInterceptorMethodInterceptRequestName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    dynamic interceptFollowRedirect([Function responseFactory = null]) {
-      var params = new _UrlLoaderInterceptorInterceptFollowRedirectParams();
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _urlLoaderInterceptorMethodInterceptFollowRedirectName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    dynamic interceptResponse(url_response_mojom.UrlResponse response,[Function responseFactory = null]) {
-      var params = new _UrlLoaderInterceptorInterceptResponseParams();
-      params.response = response;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _urlLoaderInterceptorMethodInterceptResponseName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-}
-
-
-class UrlLoaderInterceptorProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  UrlLoaderInterceptor ptr;
-
-  UrlLoaderInterceptorProxy(_UrlLoaderInterceptorProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _UrlLoaderInterceptorProxyCalls(proxyImpl);
-
+class UrlLoaderInterceptorProxy extends bindings.Proxy
+                              implements UrlLoaderInterceptor {
   UrlLoaderInterceptorProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _UrlLoaderInterceptorProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _UrlLoaderInterceptorProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _UrlLoaderInterceptorProxyControl.fromEndpoint(endpoint));
 
-  UrlLoaderInterceptorProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _UrlLoaderInterceptorProxyImpl.fromHandle(handle) {
-    ptr = new _UrlLoaderInterceptorProxyCalls(impl);
-  }
+  UrlLoaderInterceptorProxy.fromHandle(core.MojoHandle handle)
+      : super(new _UrlLoaderInterceptorProxyControl.fromHandle(handle));
 
-  UrlLoaderInterceptorProxy.unbound() :
-      impl = new _UrlLoaderInterceptorProxyImpl.unbound() {
-    ptr = new _UrlLoaderInterceptorProxyCalls(impl);
+  UrlLoaderInterceptorProxy.unbound()
+      : super(new _UrlLoaderInterceptorProxyControl.unbound());
+
+  static UrlLoaderInterceptorProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For UrlLoaderInterceptorProxy"));
+    return new UrlLoaderInterceptorProxy.fromEndpoint(endpoint);
   }
 
   factory UrlLoaderInterceptorProxy.connectToService(
@@ -977,30 +900,32 @@
     return p;
   }
 
-  static UrlLoaderInterceptorProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For UrlLoaderInterceptorProxy"));
-    return new UrlLoaderInterceptorProxy.fromEndpoint(endpoint);
+
+  dynamic interceptRequest(url_request_mojom.UrlRequest request,[Function responseFactory = null]) {
+    var params = new _UrlLoaderInterceptorInterceptRequestParams();
+    params.request = request;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _urlLoaderInterceptorMethodInterceptRequestName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
-
-  String get serviceName => UrlLoaderInterceptor.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
+  dynamic interceptFollowRedirect([Function responseFactory = null]) {
+    var params = new _UrlLoaderInterceptorInterceptFollowRedirectParams();
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _urlLoaderInterceptorMethodInterceptFollowRedirectName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
-
-  String toString() {
-    return "UrlLoaderInterceptorProxy($impl)";
+  dynamic interceptResponse(url_response_mojom.UrlResponse response,[Function responseFactory = null]) {
+    var params = new _UrlLoaderInterceptorInterceptResponseParams();
+    params.response = response;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _urlLoaderInterceptorMethodInterceptResponseName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
 }
 
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 0aa0367..a8dc0e7 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
@@ -667,24 +667,22 @@
 }
 
 
-class _UrlResponseDiskCacheProxyImpl extends bindings.Proxy {
-  _UrlResponseDiskCacheProxyImpl.fromEndpoint(
+class _UrlResponseDiskCacheProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _UrlResponseDiskCacheProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _UrlResponseDiskCacheProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _UrlResponseDiskCacheProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _UrlResponseDiskCacheProxyImpl.unbound() : super.unbound();
-
-  static _UrlResponseDiskCacheProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _UrlResponseDiskCacheProxyImpl"));
-    return new _UrlResponseDiskCacheProxyImpl.fromEndpoint(endpoint);
-  }
+  _UrlResponseDiskCacheProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _UrlResponseDiskCacheServiceDescription();
+      new _UrlResponseDiskCacheServiceDescription();
 
+  String get serviceName => UrlResponseDiskCache.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _urlResponseDiskCacheMethodGetName:
@@ -754,87 +752,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_UrlResponseDiskCacheProxyImpl($superString)";
+    return "_UrlResponseDiskCacheProxyControl($superString)";
   }
 }
 
 
-class _UrlResponseDiskCacheProxyCalls implements UrlResponseDiskCache {
-  _UrlResponseDiskCacheProxyImpl _proxyImpl;
-
-  _UrlResponseDiskCacheProxyCalls(this._proxyImpl);
-    dynamic get(String url,[Function responseFactory = null]) {
-      var params = new _UrlResponseDiskCacheGetParams();
-      params.url = url;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _urlResponseDiskCacheMethodGetName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    void validate(String url) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _UrlResponseDiskCacheValidateParams();
-      params.url = url;
-      _proxyImpl.sendMessage(params, _urlResponseDiskCacheMethodValidateName);
-    }
-    void update(url_response_mojom.UrlResponse response) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _UrlResponseDiskCacheUpdateParams();
-      params.response = response;
-      _proxyImpl.sendMessage(params, _urlResponseDiskCacheMethodUpdateName);
-    }
-    dynamic updateAndGet(url_response_mojom.UrlResponse response,[Function responseFactory = null]) {
-      var params = new _UrlResponseDiskCacheUpdateAndGetParams();
-      params.response = response;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _urlResponseDiskCacheMethodUpdateAndGetName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    dynamic updateAndGetExtracted(url_response_mojom.UrlResponse response,[Function responseFactory = null]) {
-      var params = new _UrlResponseDiskCacheUpdateAndGetExtractedParams();
-      params.response = response;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _urlResponseDiskCacheMethodUpdateAndGetExtractedName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-}
-
-
-class UrlResponseDiskCacheProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  UrlResponseDiskCache ptr;
-
-  UrlResponseDiskCacheProxy(_UrlResponseDiskCacheProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _UrlResponseDiskCacheProxyCalls(proxyImpl);
-
+class UrlResponseDiskCacheProxy extends bindings.Proxy
+                              implements UrlResponseDiskCache {
   UrlResponseDiskCacheProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _UrlResponseDiskCacheProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _UrlResponseDiskCacheProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _UrlResponseDiskCacheProxyControl.fromEndpoint(endpoint));
 
-  UrlResponseDiskCacheProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _UrlResponseDiskCacheProxyImpl.fromHandle(handle) {
-    ptr = new _UrlResponseDiskCacheProxyCalls(impl);
-  }
+  UrlResponseDiskCacheProxy.fromHandle(core.MojoHandle handle)
+      : super(new _UrlResponseDiskCacheProxyControl.fromHandle(handle));
 
-  UrlResponseDiskCacheProxy.unbound() :
-      impl = new _UrlResponseDiskCacheProxyImpl.unbound() {
-    ptr = new _UrlResponseDiskCacheProxyCalls(impl);
+  UrlResponseDiskCacheProxy.unbound()
+      : super(new _UrlResponseDiskCacheProxyControl.unbound());
+
+  static UrlResponseDiskCacheProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For UrlResponseDiskCacheProxy"));
+    return new UrlResponseDiskCacheProxy.fromEndpoint(endpoint);
   }
 
   factory UrlResponseDiskCacheProxy.connectToService(
@@ -844,30 +785,53 @@
     return p;
   }
 
-  static UrlResponseDiskCacheProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For UrlResponseDiskCacheProxy"));
-    return new UrlResponseDiskCacheProxy.fromEndpoint(endpoint);
+
+  dynamic get(String url,[Function responseFactory = null]) {
+    var params = new _UrlResponseDiskCacheGetParams();
+    params.url = url;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _urlResponseDiskCacheMethodGetName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
-
-  String get serviceName => UrlResponseDiskCache.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
+  void validate(String url) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _UrlResponseDiskCacheValidateParams();
+    params.url = url;
+    ctrl.sendMessage(params,
+        _urlResponseDiskCacheMethodValidateName);
   }
-
-  String toString() {
-    return "UrlResponseDiskCacheProxy($impl)";
+  void update(url_response_mojom.UrlResponse response) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _UrlResponseDiskCacheUpdateParams();
+    params.response = response;
+    ctrl.sendMessage(params,
+        _urlResponseDiskCacheMethodUpdateName);
+  }
+  dynamic updateAndGet(url_response_mojom.UrlResponse response,[Function responseFactory = null]) {
+    var params = new _UrlResponseDiskCacheUpdateAndGetParams();
+    params.response = response;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _urlResponseDiskCacheMethodUpdateAndGetName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
+  }
+  dynamic updateAndGetExtracted(url_response_mojom.UrlResponse response,[Function responseFactory = null]) {
+    var params = new _UrlResponseDiskCacheUpdateAndGetExtractedParams();
+    params.response = response;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _urlResponseDiskCacheMethodUpdateAndGetExtractedName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
 }
 
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 2a272c9..61ca5da 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
@@ -934,29 +934,27 @@
   void connect(String url, List<String> protocols, String origin, core.MojoDataPipeConsumer sendStream, Object client);
   void send(bool fin, WebSocketMessageType type, int numBytes);
   void flowControl(int quota);
-  void close(int code, String reason);
+  void close_(int code, String reason);
   static const int kAbnormalCloseCode = 1006;
 }
 
 
-class _WebSocketProxyImpl extends bindings.Proxy {
-  _WebSocketProxyImpl.fromEndpoint(
+class _WebSocketProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _WebSocketProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _WebSocketProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _WebSocketProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _WebSocketProxyImpl.unbound() : super.unbound();
-
-  static _WebSocketProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _WebSocketProxyImpl"));
-    return new _WebSocketProxyImpl.fromEndpoint(endpoint);
-  }
+  _WebSocketProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _WebSocketServiceDescription();
+      new _WebSocketServiceDescription();
 
+  String get serviceName => WebSocket.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -966,85 +964,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_WebSocketProxyImpl($superString)";
+    return "_WebSocketProxyControl($superString)";
   }
 }
 
 
-class _WebSocketProxyCalls implements WebSocket {
-  _WebSocketProxyImpl _proxyImpl;
-
-  _WebSocketProxyCalls(this._proxyImpl);
-    void connect(String url, List<String> protocols, String origin, core.MojoDataPipeConsumer sendStream, Object client) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _WebSocketConnectParams();
-      params.url = url;
-      params.protocols = protocols;
-      params.origin = origin;
-      params.sendStream = sendStream;
-      params.client = client;
-      _proxyImpl.sendMessage(params, _webSocketMethodConnectName);
-    }
-    void send(bool fin, WebSocketMessageType type, int numBytes) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _WebSocketSendParams();
-      params.fin = fin;
-      params.type = type;
-      params.numBytes = numBytes;
-      _proxyImpl.sendMessage(params, _webSocketMethodSendName);
-    }
-    void flowControl(int quota) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _WebSocketFlowControlParams();
-      params.quota = quota;
-      _proxyImpl.sendMessage(params, _webSocketMethodFlowControlName);
-    }
-    void close(int code, String reason) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _WebSocketCloseParams();
-      params.code = code;
-      params.reason = reason;
-      _proxyImpl.sendMessage(params, _webSocketMethodCloseName);
-    }
-}
-
-
-class WebSocketProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  WebSocket ptr;
-
-  WebSocketProxy(_WebSocketProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _WebSocketProxyCalls(proxyImpl);
-
+class WebSocketProxy extends bindings.Proxy
+                              implements WebSocket {
   WebSocketProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _WebSocketProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _WebSocketProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _WebSocketProxyControl.fromEndpoint(endpoint));
 
-  WebSocketProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _WebSocketProxyImpl.fromHandle(handle) {
-    ptr = new _WebSocketProxyCalls(impl);
-  }
+  WebSocketProxy.fromHandle(core.MojoHandle handle)
+      : super(new _WebSocketProxyControl.fromHandle(handle));
 
-  WebSocketProxy.unbound() :
-      impl = new _WebSocketProxyImpl.unbound() {
-    ptr = new _WebSocketProxyCalls(impl);
+  WebSocketProxy.unbound()
+      : super(new _WebSocketProxyControl.unbound());
+
+  static WebSocketProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For WebSocketProxy"));
+    return new WebSocketProxy.fromEndpoint(endpoint);
   }
 
   factory WebSocketProxy.connectToService(
@@ -1054,30 +997,53 @@
     return p;
   }
 
-  static WebSocketProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For WebSocketProxy"));
-    return new WebSocketProxy.fromEndpoint(endpoint);
+
+  void connect(String url, List<String> protocols, String origin, core.MojoDataPipeConsumer sendStream, Object client) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _WebSocketConnectParams();
+    params.url = url;
+    params.protocols = protocols;
+    params.origin = origin;
+    params.sendStream = sendStream;
+    params.client = client;
+    ctrl.sendMessage(params,
+        _webSocketMethodConnectName);
   }
-
-  String get serviceName => WebSocket.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
+  void send(bool fin, WebSocketMessageType type, int numBytes) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _WebSocketSendParams();
+    params.fin = fin;
+    params.type = type;
+    params.numBytes = numBytes;
+    ctrl.sendMessage(params,
+        _webSocketMethodSendName);
   }
-
-  String toString() {
-    return "WebSocketProxy($impl)";
+  void flowControl(int quota) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _WebSocketFlowControlParams();
+    params.quota = quota;
+    ctrl.sendMessage(params,
+        _webSocketMethodFlowControlName);
+  }
+  void close_(int code, String reason) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _WebSocketCloseParams();
+    params.code = code;
+    params.reason = reason;
+    ctrl.sendMessage(params,
+        _webSocketMethodCloseName);
   }
 }
 
@@ -1135,7 +1101,7 @@
       case _webSocketMethodCloseName:
         var params = _WebSocketCloseParams.deserialize(
             message.payload);
-        _impl.close(params.code, params.reason);
+        _impl.close_(params.code, params.reason);
         break;
       default:
         throw new bindings.MojoCodecError("Unexpected message name");
@@ -1206,24 +1172,22 @@
 }
 
 
-class _WebSocketClientProxyImpl extends bindings.Proxy {
-  _WebSocketClientProxyImpl.fromEndpoint(
+class _WebSocketClientProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _WebSocketClientProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _WebSocketClientProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _WebSocketClientProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _WebSocketClientProxyImpl.unbound() : super.unbound();
-
-  static _WebSocketClientProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _WebSocketClientProxyImpl"));
-    return new _WebSocketClientProxyImpl.fromEndpoint(endpoint);
-  }
+  _WebSocketClientProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _WebSocketClientServiceDescription();
+      new _WebSocketClientServiceDescription();
 
+  String get serviceName => WebSocketClient.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -1233,93 +1197,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_WebSocketClientProxyImpl($superString)";
+    return "_WebSocketClientProxyControl($superString)";
   }
 }
 
 
-class _WebSocketClientProxyCalls implements WebSocketClient {
-  _WebSocketClientProxyImpl _proxyImpl;
-
-  _WebSocketClientProxyCalls(this._proxyImpl);
-    void didConnect(String selectedSubprotocol, String extensions, core.MojoDataPipeConsumer receiveStream) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _WebSocketClientDidConnectParams();
-      params.selectedSubprotocol = selectedSubprotocol;
-      params.extensions = extensions;
-      params.receiveStream = receiveStream;
-      _proxyImpl.sendMessage(params, _webSocketClientMethodDidConnectName);
-    }
-    void didReceiveData(bool fin, WebSocketMessageType type, int numBytes) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _WebSocketClientDidReceiveDataParams();
-      params.fin = fin;
-      params.type = type;
-      params.numBytes = numBytes;
-      _proxyImpl.sendMessage(params, _webSocketClientMethodDidReceiveDataName);
-    }
-    void didReceiveFlowControl(int quota) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _WebSocketClientDidReceiveFlowControlParams();
-      params.quota = quota;
-      _proxyImpl.sendMessage(params, _webSocketClientMethodDidReceiveFlowControlName);
-    }
-    void didFail(String message) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _WebSocketClientDidFailParams();
-      params.message = message;
-      _proxyImpl.sendMessage(params, _webSocketClientMethodDidFailName);
-    }
-    void didClose(bool wasClean, int code, String reason) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _WebSocketClientDidCloseParams();
-      params.wasClean = wasClean;
-      params.code = code;
-      params.reason = reason;
-      _proxyImpl.sendMessage(params, _webSocketClientMethodDidCloseName);
-    }
-}
-
-
-class WebSocketClientProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  WebSocketClient ptr;
-
-  WebSocketClientProxy(_WebSocketClientProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _WebSocketClientProxyCalls(proxyImpl);
-
+class WebSocketClientProxy extends bindings.Proxy
+                              implements WebSocketClient {
   WebSocketClientProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _WebSocketClientProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _WebSocketClientProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _WebSocketClientProxyControl.fromEndpoint(endpoint));
 
-  WebSocketClientProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _WebSocketClientProxyImpl.fromHandle(handle) {
-    ptr = new _WebSocketClientProxyCalls(impl);
-  }
+  WebSocketClientProxy.fromHandle(core.MojoHandle handle)
+      : super(new _WebSocketClientProxyControl.fromHandle(handle));
 
-  WebSocketClientProxy.unbound() :
-      impl = new _WebSocketClientProxyImpl.unbound() {
-    ptr = new _WebSocketClientProxyCalls(impl);
+  WebSocketClientProxy.unbound()
+      : super(new _WebSocketClientProxyControl.unbound());
+
+  static WebSocketClientProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For WebSocketClientProxy"));
+    return new WebSocketClientProxy.fromEndpoint(endpoint);
   }
 
   factory WebSocketClientProxy.connectToService(
@@ -1329,30 +1230,62 @@
     return p;
   }
 
-  static WebSocketClientProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For WebSocketClientProxy"));
-    return new WebSocketClientProxy.fromEndpoint(endpoint);
+
+  void didConnect(String selectedSubprotocol, String extensions, core.MojoDataPipeConsumer receiveStream) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _WebSocketClientDidConnectParams();
+    params.selectedSubprotocol = selectedSubprotocol;
+    params.extensions = extensions;
+    params.receiveStream = receiveStream;
+    ctrl.sendMessage(params,
+        _webSocketClientMethodDidConnectName);
   }
-
-  String get serviceName => WebSocketClient.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
+  void didReceiveData(bool fin, WebSocketMessageType type, int numBytes) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _WebSocketClientDidReceiveDataParams();
+    params.fin = fin;
+    params.type = type;
+    params.numBytes = numBytes;
+    ctrl.sendMessage(params,
+        _webSocketClientMethodDidReceiveDataName);
   }
-
-  String toString() {
-    return "WebSocketClientProxy($impl)";
+  void didReceiveFlowControl(int quota) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _WebSocketClientDidReceiveFlowControlParams();
+    params.quota = quota;
+    ctrl.sendMessage(params,
+        _webSocketClientMethodDidReceiveFlowControlName);
+  }
+  void didFail(String message) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _WebSocketClientDidFailParams();
+    params.message = message;
+    ctrl.sendMessage(params,
+        _webSocketClientMethodDidFailName);
+  }
+  void didClose(bool wasClean, int code, String reason) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _WebSocketClientDidCloseParams();
+    params.wasClean = wasClean;
+    params.code = code;
+    params.reason = reason;
+    ctrl.sendMessage(params,
+        _webSocketClientMethodDidCloseName);
   }
 }
 
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 f07dee7..be717ac 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
@@ -820,24 +820,22 @@
 }
 
 
-class _ProcessProxyImpl extends bindings.Proxy {
-  _ProcessProxyImpl.fromEndpoint(
+class _ProcessProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _ProcessProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _ProcessProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _ProcessProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _ProcessProxyImpl.unbound() : super.unbound();
-
-  static _ProcessProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _ProcessProxyImpl"));
-    return new _ProcessProxyImpl.fromEndpoint(endpoint);
-  }
+  _ProcessProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _ProcessServiceDescription();
+      new _ProcessServiceDescription();
 
+  String get serviceName => Process.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _processMethodSpawnName:
@@ -887,70 +885,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_ProcessProxyImpl($superString)";
+    return "_ProcessProxyControl($superString)";
   }
 }
 
 
-class _ProcessProxyCalls implements Process {
-  _ProcessProxyImpl _proxyImpl;
-
-  _ProcessProxyCalls(this._proxyImpl);
-    dynamic spawn(List<int> path,List<List<int>> argv,List<List<int>> envp,Object stdinFile,Object stdoutFile,Object stderrFile,Object processController,[Function responseFactory = null]) {
-      var params = new _ProcessSpawnParams();
-      params.path = path;
-      params.argv = argv;
-      params.envp = envp;
-      params.stdinFile = stdinFile;
-      params.stdoutFile = stdoutFile;
-      params.stderrFile = stderrFile;
-      params.processController = processController;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _processMethodSpawnName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    dynamic spawnWithTerminal(List<int> path,List<List<int>> argv,List<List<int>> envp,Object terminalFile,Object processController,[Function responseFactory = null]) {
-      var params = new _ProcessSpawnWithTerminalParams();
-      params.path = path;
-      params.argv = argv;
-      params.envp = envp;
-      params.terminalFile = terminalFile;
-      params.processController = processController;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _processMethodSpawnWithTerminalName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-}
-
-
-class ProcessProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  Process ptr;
-
-  ProcessProxy(_ProcessProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _ProcessProxyCalls(proxyImpl);
-
+class ProcessProxy extends bindings.Proxy
+                              implements Process {
   ProcessProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _ProcessProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _ProcessProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _ProcessProxyControl.fromEndpoint(endpoint));
 
-  ProcessProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _ProcessProxyImpl.fromHandle(handle) {
-    ptr = new _ProcessProxyCalls(impl);
-  }
+  ProcessProxy.fromHandle(core.MojoHandle handle)
+      : super(new _ProcessProxyControl.fromHandle(handle));
 
-  ProcessProxy.unbound() :
-      impl = new _ProcessProxyImpl.unbound() {
-    ptr = new _ProcessProxyCalls(impl);
+  ProcessProxy.unbound()
+      : super(new _ProcessProxyControl.unbound());
+
+  static ProcessProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ProcessProxy"));
+    return new ProcessProxy.fromEndpoint(endpoint);
   }
 
   factory ProcessProxy.connectToService(
@@ -960,30 +918,34 @@
     return p;
   }
 
-  static ProcessProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For ProcessProxy"));
-    return new ProcessProxy.fromEndpoint(endpoint);
+
+  dynamic spawn(List<int> path,List<List<int>> argv,List<List<int>> envp,Object stdinFile,Object stdoutFile,Object stderrFile,Object processController,[Function responseFactory = null]) {
+    var params = new _ProcessSpawnParams();
+    params.path = path;
+    params.argv = argv;
+    params.envp = envp;
+    params.stdinFile = stdinFile;
+    params.stdoutFile = stdoutFile;
+    params.stderrFile = stderrFile;
+    params.processController = processController;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _processMethodSpawnName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
-
-  String get serviceName => Process.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "ProcessProxy($impl)";
+  dynamic spawnWithTerminal(List<int> path,List<List<int>> argv,List<List<int>> envp,Object terminalFile,Object processController,[Function responseFactory = null]) {
+    var params = new _ProcessSpawnWithTerminalParams();
+    params.path = path;
+    params.argv = argv;
+    params.envp = envp;
+    params.terminalFile = terminalFile;
+    params.processController = processController;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _processMethodSpawnWithTerminalName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
 }
 
@@ -1140,24 +1102,22 @@
 }
 
 
-class _ProcessControllerProxyImpl extends bindings.Proxy {
-  _ProcessControllerProxyImpl.fromEndpoint(
+class _ProcessControllerProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _ProcessControllerProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _ProcessControllerProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _ProcessControllerProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _ProcessControllerProxyImpl.unbound() : super.unbound();
-
-  static _ProcessControllerProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _ProcessControllerProxyImpl"));
-    return new _ProcessControllerProxyImpl.fromEndpoint(endpoint);
-  }
+  _ProcessControllerProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _ProcessControllerServiceDescription();
+      new _ProcessControllerServiceDescription();
 
+  String get serviceName => ProcessController.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _processControllerMethodWaitName:
@@ -1207,59 +1167,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_ProcessControllerProxyImpl($superString)";
+    return "_ProcessControllerProxyControl($superString)";
   }
 }
 
 
-class _ProcessControllerProxyCalls implements ProcessController {
-  _ProcessControllerProxyImpl _proxyImpl;
-
-  _ProcessControllerProxyCalls(this._proxyImpl);
-    dynamic wait([Function responseFactory = null]) {
-      var params = new _ProcessControllerWaitParams();
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _processControllerMethodWaitName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    dynamic kill(int signal,[Function responseFactory = null]) {
-      var params = new _ProcessControllerKillParams();
-      params.signal = signal;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _processControllerMethodKillName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-}
-
-
-class ProcessControllerProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  ProcessController ptr;
-
-  ProcessControllerProxy(_ProcessControllerProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _ProcessControllerProxyCalls(proxyImpl);
-
+class ProcessControllerProxy extends bindings.Proxy
+                              implements ProcessController {
   ProcessControllerProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _ProcessControllerProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _ProcessControllerProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _ProcessControllerProxyControl.fromEndpoint(endpoint));
 
-  ProcessControllerProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _ProcessControllerProxyImpl.fromHandle(handle) {
-    ptr = new _ProcessControllerProxyCalls(impl);
-  }
+  ProcessControllerProxy.fromHandle(core.MojoHandle handle)
+      : super(new _ProcessControllerProxyControl.fromHandle(handle));
 
-  ProcessControllerProxy.unbound() :
-      impl = new _ProcessControllerProxyImpl.unbound() {
-    ptr = new _ProcessControllerProxyCalls(impl);
+  ProcessControllerProxy.unbound()
+      : super(new _ProcessControllerProxyControl.unbound());
+
+  static ProcessControllerProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ProcessControllerProxy"));
+    return new ProcessControllerProxy.fromEndpoint(endpoint);
   }
 
   factory ProcessControllerProxy.connectToService(
@@ -1269,30 +1200,23 @@
     return p;
   }
 
-  static ProcessControllerProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For ProcessControllerProxy"));
-    return new ProcessControllerProxy.fromEndpoint(endpoint);
+
+  dynamic wait([Function responseFactory = null]) {
+    var params = new _ProcessControllerWaitParams();
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _processControllerMethodWaitName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
-
-  String get serviceName => ProcessController.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "ProcessControllerProxy($impl)";
+  dynamic kill(int signal,[Function responseFactory = null]) {
+    var params = new _ProcessControllerKillParams();
+    params.signal = signal;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _processControllerMethodKillName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
 }
 
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 79a54ed..e83046d 100644
--- a/mojo/dart/packages/mojo_services/lib/nfc/nfc.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/nfc/nfc.mojom.dart
@@ -504,24 +504,22 @@
 }
 
 
-class _NfcTransmissionProxyImpl extends bindings.Proxy {
-  _NfcTransmissionProxyImpl.fromEndpoint(
+class _NfcTransmissionProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _NfcTransmissionProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _NfcTransmissionProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _NfcTransmissionProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _NfcTransmissionProxyImpl.unbound() : super.unbound();
-
-  static _NfcTransmissionProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _NfcTransmissionProxyImpl"));
-    return new _NfcTransmissionProxyImpl.fromEndpoint(endpoint);
-  }
+  _NfcTransmissionProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _NfcTransmissionServiceDescription();
+      new _NfcTransmissionServiceDescription();
 
+  String get serviceName => NfcTransmission.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -531,50 +529,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_NfcTransmissionProxyImpl($superString)";
+    return "_NfcTransmissionProxyControl($superString)";
   }
 }
 
 
-class _NfcTransmissionProxyCalls implements NfcTransmission {
-  _NfcTransmissionProxyImpl _proxyImpl;
-
-  _NfcTransmissionProxyCalls(this._proxyImpl);
-    void cancel() {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _NfcTransmissionCancelParams();
-      _proxyImpl.sendMessage(params, _nfcTransmissionMethodCancelName);
-    }
-}
-
-
-class NfcTransmissionProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  NfcTransmission ptr;
-
-  NfcTransmissionProxy(_NfcTransmissionProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _NfcTransmissionProxyCalls(proxyImpl);
-
+class NfcTransmissionProxy extends bindings.Proxy
+                              implements NfcTransmission {
   NfcTransmissionProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _NfcTransmissionProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _NfcTransmissionProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _NfcTransmissionProxyControl.fromEndpoint(endpoint));
 
-  NfcTransmissionProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _NfcTransmissionProxyImpl.fromHandle(handle) {
-    ptr = new _NfcTransmissionProxyCalls(impl);
-  }
+  NfcTransmissionProxy.fromHandle(core.MojoHandle handle)
+      : super(new _NfcTransmissionProxyControl.fromHandle(handle));
 
-  NfcTransmissionProxy.unbound() :
-      impl = new _NfcTransmissionProxyImpl.unbound() {
-    ptr = new _NfcTransmissionProxyCalls(impl);
+  NfcTransmissionProxy.unbound()
+      : super(new _NfcTransmissionProxyControl.unbound());
+
+  static NfcTransmissionProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For NfcTransmissionProxy"));
+    return new NfcTransmissionProxy.fromEndpoint(endpoint);
   }
 
   factory NfcTransmissionProxy.connectToService(
@@ -584,30 +562,15 @@
     return p;
   }
 
-  static NfcTransmissionProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For NfcTransmissionProxy"));
-    return new NfcTransmissionProxy.fromEndpoint(endpoint);
-  }
 
-  String get serviceName => NfcTransmission.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "NfcTransmissionProxy($impl)";
+  void cancel() {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _NfcTransmissionCancelParams();
+    ctrl.sendMessage(params,
+        _nfcTransmissionMethodCancelName);
   }
 }
 
@@ -711,24 +674,22 @@
 }
 
 
-class _NfcReceiverProxyImpl extends bindings.Proxy {
-  _NfcReceiverProxyImpl.fromEndpoint(
+class _NfcReceiverProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _NfcReceiverProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _NfcReceiverProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _NfcReceiverProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _NfcReceiverProxyImpl.unbound() : super.unbound();
-
-  static _NfcReceiverProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _NfcReceiverProxyImpl"));
-    return new _NfcReceiverProxyImpl.fromEndpoint(endpoint);
-  }
+  _NfcReceiverProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _NfcReceiverServiceDescription();
+      new _NfcReceiverServiceDescription();
 
+  String get serviceName => NfcReceiver.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -738,51 +699,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_NfcReceiverProxyImpl($superString)";
+    return "_NfcReceiverProxyControl($superString)";
   }
 }
 
 
-class _NfcReceiverProxyCalls implements NfcReceiver {
-  _NfcReceiverProxyImpl _proxyImpl;
-
-  _NfcReceiverProxyCalls(this._proxyImpl);
-    void onReceivedNfcData(NfcData nfcData) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _NfcReceiverOnReceivedNfcDataParams();
-      params.nfcData = nfcData;
-      _proxyImpl.sendMessage(params, _nfcReceiverMethodOnReceivedNfcDataName);
-    }
-}
-
-
-class NfcReceiverProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  NfcReceiver ptr;
-
-  NfcReceiverProxy(_NfcReceiverProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _NfcReceiverProxyCalls(proxyImpl);
-
+class NfcReceiverProxy extends bindings.Proxy
+                              implements NfcReceiver {
   NfcReceiverProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _NfcReceiverProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _NfcReceiverProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _NfcReceiverProxyControl.fromEndpoint(endpoint));
 
-  NfcReceiverProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _NfcReceiverProxyImpl.fromHandle(handle) {
-    ptr = new _NfcReceiverProxyCalls(impl);
-  }
+  NfcReceiverProxy.fromHandle(core.MojoHandle handle)
+      : super(new _NfcReceiverProxyControl.fromHandle(handle));
 
-  NfcReceiverProxy.unbound() :
-      impl = new _NfcReceiverProxyImpl.unbound() {
-    ptr = new _NfcReceiverProxyCalls(impl);
+  NfcReceiverProxy.unbound()
+      : super(new _NfcReceiverProxyControl.unbound());
+
+  static NfcReceiverProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For NfcReceiverProxy"));
+    return new NfcReceiverProxy.fromEndpoint(endpoint);
   }
 
   factory NfcReceiverProxy.connectToService(
@@ -792,30 +732,16 @@
     return p;
   }
 
-  static NfcReceiverProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For NfcReceiverProxy"));
-    return new NfcReceiverProxy.fromEndpoint(endpoint);
-  }
 
-  String get serviceName => NfcReceiver.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "NfcReceiverProxy($impl)";
+  void onReceivedNfcData(NfcData nfcData) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _NfcReceiverOnReceivedNfcDataParams();
+    params.nfcData = nfcData;
+    ctrl.sendMessage(params,
+        _nfcReceiverMethodOnReceivedNfcDataName);
   }
 }
 
@@ -925,24 +851,22 @@
 }
 
 
-class _NfcProxyImpl extends bindings.Proxy {
-  _NfcProxyImpl.fromEndpoint(
+class _NfcProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _NfcProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _NfcProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _NfcProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _NfcProxyImpl.unbound() : super.unbound();
-
-  static _NfcProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _NfcProxyImpl"));
-    return new _NfcProxyImpl.fromEndpoint(endpoint);
-  }
+  _NfcProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _NfcServiceDescription();
+      new _NfcServiceDescription();
 
+  String get serviceName => Nfc.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _nfcMethodTransmitOnNextConnectionName:
@@ -972,68 +896,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_NfcProxyImpl($superString)";
+    return "_NfcProxyControl($superString)";
   }
 }
 
 
-class _NfcProxyCalls implements Nfc {
-  _NfcProxyImpl _proxyImpl;
-
-  _NfcProxyCalls(this._proxyImpl);
-    dynamic transmitOnNextConnection(NfcData nfcData,Object transmission,[Function responseFactory = null]) {
-      var params = new _NfcTransmitOnNextConnectionParams();
-      params.nfcData = nfcData;
-      params.transmission = transmission;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _nfcMethodTransmitOnNextConnectionName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-    void register() {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _NfcRegisterParams();
-      _proxyImpl.sendMessage(params, _nfcMethodRegisterName);
-    }
-    void unregister() {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _NfcUnregisterParams();
-      _proxyImpl.sendMessage(params, _nfcMethodUnregisterName);
-    }
-}
-
-
-class NfcProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  Nfc ptr;
-
-  NfcProxy(_NfcProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _NfcProxyCalls(proxyImpl);
-
+class NfcProxy extends bindings.Proxy
+                              implements Nfc {
   NfcProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _NfcProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _NfcProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _NfcProxyControl.fromEndpoint(endpoint));
 
-  NfcProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _NfcProxyImpl.fromHandle(handle) {
-    ptr = new _NfcProxyCalls(impl);
-  }
+  NfcProxy.fromHandle(core.MojoHandle handle)
+      : super(new _NfcProxyControl.fromHandle(handle));
 
-  NfcProxy.unbound() :
-      impl = new _NfcProxyImpl.unbound() {
-    ptr = new _NfcProxyCalls(impl);
+  NfcProxy.unbound()
+      : super(new _NfcProxyControl.unbound());
+
+  static NfcProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For NfcProxy"));
+    return new NfcProxy.fromEndpoint(endpoint);
   }
 
   factory NfcProxy.connectToService(
@@ -1043,30 +929,34 @@
     return p;
   }
 
-  static NfcProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For NfcProxy"));
-    return new NfcProxy.fromEndpoint(endpoint);
+
+  dynamic transmitOnNextConnection(NfcData nfcData,Object transmission,[Function responseFactory = null]) {
+    var params = new _NfcTransmitOnNextConnectionParams();
+    params.nfcData = nfcData;
+    params.transmission = transmission;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _nfcMethodTransmitOnNextConnectionName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
-
-  String get serviceName => Nfc.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
+  void register() {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _NfcRegisterParams();
+    ctrl.sendMessage(params,
+        _nfcMethodRegisterName);
   }
-
-  String toString() {
-    return "NfcProxy($impl)";
+  void unregister() {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _NfcUnregisterParams();
+    ctrl.sendMessage(params,
+        _nfcMethodUnregisterName);
   }
 }
 
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 4067ffa..c2c8c41 100644
--- a/mojo/dart/packages/mojo_services/lib/notifications/notifications.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/notifications/notifications.mojom.dart
@@ -503,24 +503,22 @@
 }
 
 
-class _NotificationClientProxyImpl extends bindings.Proxy {
-  _NotificationClientProxyImpl.fromEndpoint(
+class _NotificationClientProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _NotificationClientProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _NotificationClientProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _NotificationClientProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _NotificationClientProxyImpl.unbound() : super.unbound();
-
-  static _NotificationClientProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _NotificationClientProxyImpl"));
-    return new _NotificationClientProxyImpl.fromEndpoint(endpoint);
-  }
+  _NotificationClientProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _NotificationClientServiceDescription();
+      new _NotificationClientServiceDescription();
 
+  String get serviceName => NotificationClient.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -530,58 +528,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_NotificationClientProxyImpl($superString)";
+    return "_NotificationClientProxyControl($superString)";
   }
 }
 
 
-class _NotificationClientProxyCalls implements NotificationClient {
-  _NotificationClientProxyImpl _proxyImpl;
-
-  _NotificationClientProxyCalls(this._proxyImpl);
-    void onSelected() {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _NotificationClientOnSelectedParams();
-      _proxyImpl.sendMessage(params, _notificationClientMethodOnSelectedName);
-    }
-    void onDismissed() {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _NotificationClientOnDismissedParams();
-      _proxyImpl.sendMessage(params, _notificationClientMethodOnDismissedName);
-    }
-}
-
-
-class NotificationClientProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  NotificationClient ptr;
-
-  NotificationClientProxy(_NotificationClientProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _NotificationClientProxyCalls(proxyImpl);
-
+class NotificationClientProxy extends bindings.Proxy
+                              implements NotificationClient {
   NotificationClientProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _NotificationClientProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _NotificationClientProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _NotificationClientProxyControl.fromEndpoint(endpoint));
 
-  NotificationClientProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _NotificationClientProxyImpl.fromHandle(handle) {
-    ptr = new _NotificationClientProxyCalls(impl);
-  }
+  NotificationClientProxy.fromHandle(core.MojoHandle handle)
+      : super(new _NotificationClientProxyControl.fromHandle(handle));
 
-  NotificationClientProxy.unbound() :
-      impl = new _NotificationClientProxyImpl.unbound() {
-    ptr = new _NotificationClientProxyCalls(impl);
+  NotificationClientProxy.unbound()
+      : super(new _NotificationClientProxyControl.unbound());
+
+  static NotificationClientProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For NotificationClientProxy"));
+    return new NotificationClientProxy.fromEndpoint(endpoint);
   }
 
   factory NotificationClientProxy.connectToService(
@@ -591,30 +561,24 @@
     return p;
   }
 
-  static NotificationClientProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For NotificationClientProxy"));
-    return new NotificationClientProxy.fromEndpoint(endpoint);
+
+  void onSelected() {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _NotificationClientOnSelectedParams();
+    ctrl.sendMessage(params,
+        _notificationClientMethodOnSelectedName);
   }
-
-  String get serviceName => NotificationClient.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "NotificationClientProxy($impl)";
+  void onDismissed() {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _NotificationClientOnDismissedParams();
+    ctrl.sendMessage(params,
+        _notificationClientMethodOnDismissedName);
   }
 }
 
@@ -723,24 +687,22 @@
 }
 
 
-class _NotificationProxyImpl extends bindings.Proxy {
-  _NotificationProxyImpl.fromEndpoint(
+class _NotificationProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _NotificationProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _NotificationProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _NotificationProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _NotificationProxyImpl.unbound() : super.unbound();
-
-  static _NotificationProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _NotificationProxyImpl"));
-    return new _NotificationProxyImpl.fromEndpoint(endpoint);
-  }
+  _NotificationProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _NotificationServiceDescription();
+      new _NotificationServiceDescription();
 
+  String get serviceName => Notification.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -750,59 +712,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_NotificationProxyImpl($superString)";
+    return "_NotificationProxyControl($superString)";
   }
 }
 
 
-class _NotificationProxyCalls implements Notification {
-  _NotificationProxyImpl _proxyImpl;
-
-  _NotificationProxyCalls(this._proxyImpl);
-    void update(NotificationData notificationData) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _NotificationUpdateParams();
-      params.notificationData = notificationData;
-      _proxyImpl.sendMessage(params, _notificationMethodUpdateName);
-    }
-    void cancel() {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _NotificationCancelParams();
-      _proxyImpl.sendMessage(params, _notificationMethodCancelName);
-    }
-}
-
-
-class NotificationProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  Notification ptr;
-
-  NotificationProxy(_NotificationProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _NotificationProxyCalls(proxyImpl);
-
+class NotificationProxy extends bindings.Proxy
+                              implements Notification {
   NotificationProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _NotificationProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _NotificationProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _NotificationProxyControl.fromEndpoint(endpoint));
 
-  NotificationProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _NotificationProxyImpl.fromHandle(handle) {
-    ptr = new _NotificationProxyCalls(impl);
-  }
+  NotificationProxy.fromHandle(core.MojoHandle handle)
+      : super(new _NotificationProxyControl.fromHandle(handle));
 
-  NotificationProxy.unbound() :
-      impl = new _NotificationProxyImpl.unbound() {
-    ptr = new _NotificationProxyCalls(impl);
+  NotificationProxy.unbound()
+      : super(new _NotificationProxyControl.unbound());
+
+  static NotificationProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For NotificationProxy"));
+    return new NotificationProxy.fromEndpoint(endpoint);
   }
 
   factory NotificationProxy.connectToService(
@@ -812,30 +745,25 @@
     return p;
   }
 
-  static NotificationProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For NotificationProxy"));
-    return new NotificationProxy.fromEndpoint(endpoint);
+
+  void update(NotificationData notificationData) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _NotificationUpdateParams();
+    params.notificationData = notificationData;
+    ctrl.sendMessage(params,
+        _notificationMethodUpdateName);
   }
-
-  String get serviceName => Notification.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "NotificationProxy($impl)";
+  void cancel() {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _NotificationCancelParams();
+    ctrl.sendMessage(params,
+        _notificationMethodCancelName);
   }
 }
 
@@ -944,24 +872,22 @@
 }
 
 
-class _NotificationServiceProxyImpl extends bindings.Proxy {
-  _NotificationServiceProxyImpl.fromEndpoint(
+class _NotificationServiceProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _NotificationServiceProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _NotificationServiceProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _NotificationServiceProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _NotificationServiceProxyImpl.unbound() : super.unbound();
-
-  static _NotificationServiceProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _NotificationServiceProxyImpl"));
-    return new _NotificationServiceProxyImpl.fromEndpoint(endpoint);
-  }
+  _NotificationServiceProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _NotificationServiceServiceDescription();
+      new _NotificationServiceServiceDescription();
 
+  String get serviceName => NotificationService.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -971,53 +897,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_NotificationServiceProxyImpl($superString)";
+    return "_NotificationServiceProxyControl($superString)";
   }
 }
 
 
-class _NotificationServiceProxyCalls implements NotificationService {
-  _NotificationServiceProxyImpl _proxyImpl;
-
-  _NotificationServiceProxyCalls(this._proxyImpl);
-    void post(NotificationData notificationData, Object client, Object notification) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _NotificationServicePostParams();
-      params.notificationData = notificationData;
-      params.client = client;
-      params.notification = notification;
-      _proxyImpl.sendMessage(params, _notificationServiceMethodPostName);
-    }
-}
-
-
-class NotificationServiceProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  NotificationService ptr;
-
-  NotificationServiceProxy(_NotificationServiceProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _NotificationServiceProxyCalls(proxyImpl);
-
+class NotificationServiceProxy extends bindings.Proxy
+                              implements NotificationService {
   NotificationServiceProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _NotificationServiceProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _NotificationServiceProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _NotificationServiceProxyControl.fromEndpoint(endpoint));
 
-  NotificationServiceProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _NotificationServiceProxyImpl.fromHandle(handle) {
-    ptr = new _NotificationServiceProxyCalls(impl);
-  }
+  NotificationServiceProxy.fromHandle(core.MojoHandle handle)
+      : super(new _NotificationServiceProxyControl.fromHandle(handle));
 
-  NotificationServiceProxy.unbound() :
-      impl = new _NotificationServiceProxyImpl.unbound() {
-    ptr = new _NotificationServiceProxyCalls(impl);
+  NotificationServiceProxy.unbound()
+      : super(new _NotificationServiceProxyControl.unbound());
+
+  static NotificationServiceProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For NotificationServiceProxy"));
+    return new NotificationServiceProxy.fromEndpoint(endpoint);
   }
 
   factory NotificationServiceProxy.connectToService(
@@ -1027,30 +930,18 @@
     return p;
   }
 
-  static NotificationServiceProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For NotificationServiceProxy"));
-    return new NotificationServiceProxy.fromEndpoint(endpoint);
-  }
 
-  String get serviceName => NotificationService.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "NotificationServiceProxy($impl)";
+  void post(NotificationData notificationData, Object client, Object notification) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _NotificationServicePostParams();
+    params.notificationData = notificationData;
+    params.client = client;
+    params.notification = notification;
+    ctrl.sendMessage(params,
+        _notificationServiceMethodPostName);
   }
 }
 
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 f8d870c..9023ec8 100644
--- a/mojo/dart/packages/mojo_services/lib/prediction/prediction.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/prediction/prediction.mojom.dart
@@ -378,24 +378,22 @@
 }
 
 
-class _PredictionServiceProxyImpl extends bindings.Proxy {
-  _PredictionServiceProxyImpl.fromEndpoint(
+class _PredictionServiceProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _PredictionServiceProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _PredictionServiceProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _PredictionServiceProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _PredictionServiceProxyImpl.unbound() : super.unbound();
-
-  static _PredictionServiceProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _PredictionServiceProxyImpl"));
-    return new _PredictionServiceProxyImpl.fromEndpoint(endpoint);
-  }
+  _PredictionServiceProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _PredictionServiceServiceDescription();
+      new _PredictionServiceServiceDescription();
 
+  String get serviceName => PredictionService.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _predictionServiceMethodGetPredictionListName:
@@ -425,51 +423,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_PredictionServiceProxyImpl($superString)";
+    return "_PredictionServiceProxyControl($superString)";
   }
 }
 
 
-class _PredictionServiceProxyCalls implements PredictionService {
-  _PredictionServiceProxyImpl _proxyImpl;
-
-  _PredictionServiceProxyCalls(this._proxyImpl);
-    dynamic getPredictionList(PredictionInfo predictionInfo,[Function responseFactory = null]) {
-      var params = new _PredictionServiceGetPredictionListParams();
-      params.predictionInfo = predictionInfo;
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _predictionServiceMethodGetPredictionListName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-}
-
-
-class PredictionServiceProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  PredictionService ptr;
-
-  PredictionServiceProxy(_PredictionServiceProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _PredictionServiceProxyCalls(proxyImpl);
-
+class PredictionServiceProxy extends bindings.Proxy
+                              implements PredictionService {
   PredictionServiceProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _PredictionServiceProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _PredictionServiceProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _PredictionServiceProxyControl.fromEndpoint(endpoint));
 
-  PredictionServiceProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _PredictionServiceProxyImpl.fromHandle(handle) {
-    ptr = new _PredictionServiceProxyCalls(impl);
-  }
+  PredictionServiceProxy.fromHandle(core.MojoHandle handle)
+      : super(new _PredictionServiceProxyControl.fromHandle(handle));
 
-  PredictionServiceProxy.unbound() :
-      impl = new _PredictionServiceProxyImpl.unbound() {
-    ptr = new _PredictionServiceProxyCalls(impl);
+  PredictionServiceProxy.unbound()
+      : super(new _PredictionServiceProxyControl.unbound());
+
+  static PredictionServiceProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For PredictionServiceProxy"));
+    return new PredictionServiceProxy.fromEndpoint(endpoint);
   }
 
   factory PredictionServiceProxy.connectToService(
@@ -479,30 +456,15 @@
     return p;
   }
 
-  static PredictionServiceProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For PredictionServiceProxy"));
-    return new PredictionServiceProxy.fromEndpoint(endpoint);
-  }
 
-  String get serviceName => PredictionService.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "PredictionServiceProxy($impl)";
+  dynamic getPredictionList(PredictionInfo predictionInfo,[Function responseFactory = null]) {
+    var params = new _PredictionServiceGetPredictionListParams();
+    params.predictionInfo = predictionInfo;
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _predictionServiceMethodGetPredictionListName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
 }
 
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 343c1a0..533035a 100644
--- a/mojo/dart/packages/mojo_services/lib/sensors/sensors.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/sensors/sensors.mojom.dart
@@ -534,24 +534,22 @@
 }
 
 
-class _SensorListenerProxyImpl extends bindings.Proxy {
-  _SensorListenerProxyImpl.fromEndpoint(
+class _SensorListenerProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _SensorListenerProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _SensorListenerProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _SensorListenerProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _SensorListenerProxyImpl.unbound() : super.unbound();
-
-  static _SensorListenerProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _SensorListenerProxyImpl"));
-    return new _SensorListenerProxyImpl.fromEndpoint(endpoint);
-  }
+  _SensorListenerProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _SensorListenerServiceDescription();
+      new _SensorListenerServiceDescription();
 
+  String get serviceName => SensorListener.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -561,60 +559,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_SensorListenerProxyImpl($superString)";
+    return "_SensorListenerProxyControl($superString)";
   }
 }
 
 
-class _SensorListenerProxyCalls implements SensorListener {
-  _SensorListenerProxyImpl _proxyImpl;
-
-  _SensorListenerProxyCalls(this._proxyImpl);
-    void onAccuracyChanged(int accuracy) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _SensorListenerOnAccuracyChangedParams();
-      params.accuracy = accuracy;
-      _proxyImpl.sendMessage(params, _sensorListenerMethodOnAccuracyChangedName);
-    }
-    void onSensorChanged(SensorData data) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _SensorListenerOnSensorChangedParams();
-      params.data = data;
-      _proxyImpl.sendMessage(params, _sensorListenerMethodOnSensorChangedName);
-    }
-}
-
-
-class SensorListenerProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  SensorListener ptr;
-
-  SensorListenerProxy(_SensorListenerProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _SensorListenerProxyCalls(proxyImpl);
-
+class SensorListenerProxy extends bindings.Proxy
+                              implements SensorListener {
   SensorListenerProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _SensorListenerProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _SensorListenerProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _SensorListenerProxyControl.fromEndpoint(endpoint));
 
-  SensorListenerProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _SensorListenerProxyImpl.fromHandle(handle) {
-    ptr = new _SensorListenerProxyCalls(impl);
-  }
+  SensorListenerProxy.fromHandle(core.MojoHandle handle)
+      : super(new _SensorListenerProxyControl.fromHandle(handle));
 
-  SensorListenerProxy.unbound() :
-      impl = new _SensorListenerProxyImpl.unbound() {
-    ptr = new _SensorListenerProxyCalls(impl);
+  SensorListenerProxy.unbound()
+      : super(new _SensorListenerProxyControl.unbound());
+
+  static SensorListenerProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For SensorListenerProxy"));
+    return new SensorListenerProxy.fromEndpoint(endpoint);
   }
 
   factory SensorListenerProxy.connectToService(
@@ -624,30 +592,26 @@
     return p;
   }
 
-  static SensorListenerProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For SensorListenerProxy"));
-    return new SensorListenerProxy.fromEndpoint(endpoint);
+
+  void onAccuracyChanged(int accuracy) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _SensorListenerOnAccuracyChangedParams();
+    params.accuracy = accuracy;
+    ctrl.sendMessage(params,
+        _sensorListenerMethodOnAccuracyChangedName);
   }
-
-  String get serviceName => SensorListener.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "SensorListenerProxy($impl)";
+  void onSensorChanged(SensorData data) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _SensorListenerOnSensorChangedParams();
+    params.data = data;
+    ctrl.sendMessage(params,
+        _sensorListenerMethodOnSensorChangedName);
   }
 }
 
@@ -758,24 +722,22 @@
 }
 
 
-class _SensorServiceProxyImpl extends bindings.Proxy {
-  _SensorServiceProxyImpl.fromEndpoint(
+class _SensorServiceProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _SensorServiceProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _SensorServiceProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _SensorServiceProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _SensorServiceProxyImpl.unbound() : super.unbound();
-
-  static _SensorServiceProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _SensorServiceProxyImpl"));
-    return new _SensorServiceProxyImpl.fromEndpoint(endpoint);
-  }
+  _SensorServiceProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _SensorServiceServiceDescription();
+      new _SensorServiceServiceDescription();
 
+  String get serviceName => SensorService.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -785,52 +747,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_SensorServiceProxyImpl($superString)";
+    return "_SensorServiceProxyControl($superString)";
   }
 }
 
 
-class _SensorServiceProxyCalls implements SensorService {
-  _SensorServiceProxyImpl _proxyImpl;
-
-  _SensorServiceProxyCalls(this._proxyImpl);
-    void addListener(SensorType type, Object listener) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _SensorServiceAddListenerParams();
-      params.type = type;
-      params.listener = listener;
-      _proxyImpl.sendMessage(params, _sensorServiceMethodAddListenerName);
-    }
-}
-
-
-class SensorServiceProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  SensorService ptr;
-
-  SensorServiceProxy(_SensorServiceProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _SensorServiceProxyCalls(proxyImpl);
-
+class SensorServiceProxy extends bindings.Proxy
+                              implements SensorService {
   SensorServiceProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _SensorServiceProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _SensorServiceProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _SensorServiceProxyControl.fromEndpoint(endpoint));
 
-  SensorServiceProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _SensorServiceProxyImpl.fromHandle(handle) {
-    ptr = new _SensorServiceProxyCalls(impl);
-  }
+  SensorServiceProxy.fromHandle(core.MojoHandle handle)
+      : super(new _SensorServiceProxyControl.fromHandle(handle));
 
-  SensorServiceProxy.unbound() :
-      impl = new _SensorServiceProxyImpl.unbound() {
-    ptr = new _SensorServiceProxyCalls(impl);
+  SensorServiceProxy.unbound()
+      : super(new _SensorServiceProxyControl.unbound());
+
+  static SensorServiceProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For SensorServiceProxy"));
+    return new SensorServiceProxy.fromEndpoint(endpoint);
   }
 
   factory SensorServiceProxy.connectToService(
@@ -840,30 +780,17 @@
     return p;
   }
 
-  static SensorServiceProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For SensorServiceProxy"));
-    return new SensorServiceProxy.fromEndpoint(endpoint);
-  }
 
-  String get serviceName => SensorService.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "SensorServiceProxy($impl)";
+  void addListener(SensorType type, Object listener) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _SensorServiceAddListenerParams();
+    params.type = type;
+    params.listener = listener;
+    ctrl.sendMessage(params,
+        _sensorServiceMethodAddListenerName);
   }
 }
 
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 5568e13..58e8293 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
@@ -598,24 +598,22 @@
 }
 
 
-class _SpeechRecognizerListenerProxyImpl extends bindings.Proxy {
-  _SpeechRecognizerListenerProxyImpl.fromEndpoint(
+class _SpeechRecognizerListenerProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _SpeechRecognizerListenerProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _SpeechRecognizerListenerProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _SpeechRecognizerListenerProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _SpeechRecognizerListenerProxyImpl.unbound() : super.unbound();
-
-  static _SpeechRecognizerListenerProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _SpeechRecognizerListenerProxyImpl"));
-    return new _SpeechRecognizerListenerProxyImpl.fromEndpoint(endpoint);
-  }
+  _SpeechRecognizerListenerProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _SpeechRecognizerListenerServiceDescription();
+      new _SpeechRecognizerListenerServiceDescription();
 
+  String get serviceName => SpeechRecognizerListener.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -625,70 +623,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_SpeechRecognizerListenerProxyImpl($superString)";
+    return "_SpeechRecognizerListenerProxyControl($superString)";
   }
 }
 
 
-class _SpeechRecognizerListenerProxyCalls implements SpeechRecognizerListener {
-  _SpeechRecognizerListenerProxyImpl _proxyImpl;
-
-  _SpeechRecognizerListenerProxyCalls(this._proxyImpl);
-    void onRecognizerError(Error errorCode) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _SpeechRecognizerListenerOnRecognizerErrorParams();
-      params.errorCode = errorCode;
-      _proxyImpl.sendMessage(params, _speechRecognizerListenerMethodOnRecognizerErrorName);
-    }
-    void onResults(List<UtteranceCandidate> results, bool complete) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _SpeechRecognizerListenerOnResultsParams();
-      params.results = results;
-      params.complete = complete;
-      _proxyImpl.sendMessage(params, _speechRecognizerListenerMethodOnResultsName);
-    }
-    void onSoundLevelChanged(double rmsDb) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _SpeechRecognizerListenerOnSoundLevelChangedParams();
-      params.rmsDb = rmsDb;
-      _proxyImpl.sendMessage(params, _speechRecognizerListenerMethodOnSoundLevelChangedName);
-    }
-}
-
-
-class SpeechRecognizerListenerProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  SpeechRecognizerListener ptr;
-
-  SpeechRecognizerListenerProxy(_SpeechRecognizerListenerProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _SpeechRecognizerListenerProxyCalls(proxyImpl);
-
+class SpeechRecognizerListenerProxy extends bindings.Proxy
+                              implements SpeechRecognizerListener {
   SpeechRecognizerListenerProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _SpeechRecognizerListenerProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _SpeechRecognizerListenerProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _SpeechRecognizerListenerProxyControl.fromEndpoint(endpoint));
 
-  SpeechRecognizerListenerProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _SpeechRecognizerListenerProxyImpl.fromHandle(handle) {
-    ptr = new _SpeechRecognizerListenerProxyCalls(impl);
-  }
+  SpeechRecognizerListenerProxy.fromHandle(core.MojoHandle handle)
+      : super(new _SpeechRecognizerListenerProxyControl.fromHandle(handle));
 
-  SpeechRecognizerListenerProxy.unbound() :
-      impl = new _SpeechRecognizerListenerProxyImpl.unbound() {
-    ptr = new _SpeechRecognizerListenerProxyCalls(impl);
+  SpeechRecognizerListenerProxy.unbound()
+      : super(new _SpeechRecognizerListenerProxyControl.unbound());
+
+  static SpeechRecognizerListenerProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For SpeechRecognizerListenerProxy"));
+    return new SpeechRecognizerListenerProxy.fromEndpoint(endpoint);
   }
 
   factory SpeechRecognizerListenerProxy.connectToService(
@@ -698,30 +656,37 @@
     return p;
   }
 
-  static SpeechRecognizerListenerProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For SpeechRecognizerListenerProxy"));
-    return new SpeechRecognizerListenerProxy.fromEndpoint(endpoint);
+
+  void onRecognizerError(Error errorCode) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _SpeechRecognizerListenerOnRecognizerErrorParams();
+    params.errorCode = errorCode;
+    ctrl.sendMessage(params,
+        _speechRecognizerListenerMethodOnRecognizerErrorName);
   }
-
-  String get serviceName => SpeechRecognizerListener.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
+  void onResults(List<UtteranceCandidate> results, bool complete) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _SpeechRecognizerListenerOnResultsParams();
+    params.results = results;
+    params.complete = complete;
+    ctrl.sendMessage(params,
+        _speechRecognizerListenerMethodOnResultsName);
   }
-
-  String toString() {
-    return "SpeechRecognizerListenerProxy($impl)";
+  void onSoundLevelChanged(double rmsDb) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _SpeechRecognizerListenerOnSoundLevelChangedParams();
+    params.rmsDb = rmsDb;
+    ctrl.sendMessage(params,
+        _speechRecognizerListenerMethodOnSoundLevelChangedName);
   }
 }
 
@@ -839,24 +804,22 @@
 }
 
 
-class _SpeechRecognizerServiceProxyImpl extends bindings.Proxy {
-  _SpeechRecognizerServiceProxyImpl.fromEndpoint(
+class _SpeechRecognizerServiceProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _SpeechRecognizerServiceProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _SpeechRecognizerServiceProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _SpeechRecognizerServiceProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _SpeechRecognizerServiceProxyImpl.unbound() : super.unbound();
-
-  static _SpeechRecognizerServiceProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _SpeechRecognizerServiceProxyImpl"));
-    return new _SpeechRecognizerServiceProxyImpl.fromEndpoint(endpoint);
-  }
+  _SpeechRecognizerServiceProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _SpeechRecognizerServiceServiceDescription();
+      new _SpeechRecognizerServiceServiceDescription();
 
+  String get serviceName => SpeechRecognizerService.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -866,59 +829,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_SpeechRecognizerServiceProxyImpl($superString)";
+    return "_SpeechRecognizerServiceProxyControl($superString)";
   }
 }
 
 
-class _SpeechRecognizerServiceProxyCalls implements SpeechRecognizerService {
-  _SpeechRecognizerServiceProxyImpl _proxyImpl;
-
-  _SpeechRecognizerServiceProxyCalls(this._proxyImpl);
-    void listen(Object listener) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _SpeechRecognizerServiceListenParams();
-      params.listener = listener;
-      _proxyImpl.sendMessage(params, _speechRecognizerServiceMethodListenName);
-    }
-    void stopListening() {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _SpeechRecognizerServiceStopListeningParams();
-      _proxyImpl.sendMessage(params, _speechRecognizerServiceMethodStopListeningName);
-    }
-}
-
-
-class SpeechRecognizerServiceProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  SpeechRecognizerService ptr;
-
-  SpeechRecognizerServiceProxy(_SpeechRecognizerServiceProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _SpeechRecognizerServiceProxyCalls(proxyImpl);
-
+class SpeechRecognizerServiceProxy extends bindings.Proxy
+                              implements SpeechRecognizerService {
   SpeechRecognizerServiceProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _SpeechRecognizerServiceProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _SpeechRecognizerServiceProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _SpeechRecognizerServiceProxyControl.fromEndpoint(endpoint));
 
-  SpeechRecognizerServiceProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _SpeechRecognizerServiceProxyImpl.fromHandle(handle) {
-    ptr = new _SpeechRecognizerServiceProxyCalls(impl);
-  }
+  SpeechRecognizerServiceProxy.fromHandle(core.MojoHandle handle)
+      : super(new _SpeechRecognizerServiceProxyControl.fromHandle(handle));
 
-  SpeechRecognizerServiceProxy.unbound() :
-      impl = new _SpeechRecognizerServiceProxyImpl.unbound() {
-    ptr = new _SpeechRecognizerServiceProxyCalls(impl);
+  SpeechRecognizerServiceProxy.unbound()
+      : super(new _SpeechRecognizerServiceProxyControl.unbound());
+
+  static SpeechRecognizerServiceProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For SpeechRecognizerServiceProxy"));
+    return new SpeechRecognizerServiceProxy.fromEndpoint(endpoint);
   }
 
   factory SpeechRecognizerServiceProxy.connectToService(
@@ -928,30 +862,25 @@
     return p;
   }
 
-  static SpeechRecognizerServiceProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For SpeechRecognizerServiceProxy"));
-    return new SpeechRecognizerServiceProxy.fromEndpoint(endpoint);
+
+  void listen(Object listener) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _SpeechRecognizerServiceListenParams();
+    params.listener = listener;
+    ctrl.sendMessage(params,
+        _speechRecognizerServiceMethodListenName);
   }
-
-  String get serviceName => SpeechRecognizerService.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "SpeechRecognizerServiceProxy($impl)";
+  void stopListening() {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _SpeechRecognizerServiceStopListeningParams();
+    ctrl.sendMessage(params,
+        _speechRecognizerServiceMethodStopListeningName);
   }
 }
 
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 878ec70..45901a7 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
@@ -100,24 +100,22 @@
 }
 
 
-class _TraceProviderRegistryProxyImpl extends bindings.Proxy {
-  _TraceProviderRegistryProxyImpl.fromEndpoint(
+class _TraceProviderRegistryProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _TraceProviderRegistryProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _TraceProviderRegistryProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _TraceProviderRegistryProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _TraceProviderRegistryProxyImpl.unbound() : super.unbound();
-
-  static _TraceProviderRegistryProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _TraceProviderRegistryProxyImpl"));
-    return new _TraceProviderRegistryProxyImpl.fromEndpoint(endpoint);
-  }
+  _TraceProviderRegistryProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _TraceProviderRegistryServiceDescription();
+      new _TraceProviderRegistryServiceDescription();
 
+  String get serviceName => TraceProviderRegistry.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -127,51 +125,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_TraceProviderRegistryProxyImpl($superString)";
+    return "_TraceProviderRegistryProxyControl($superString)";
   }
 }
 
 
-class _TraceProviderRegistryProxyCalls implements TraceProviderRegistry {
-  _TraceProviderRegistryProxyImpl _proxyImpl;
-
-  _TraceProviderRegistryProxyCalls(this._proxyImpl);
-    void registerTraceProvider(Object traceProvider) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _TraceProviderRegistryRegisterTraceProviderParams();
-      params.traceProvider = traceProvider;
-      _proxyImpl.sendMessage(params, _traceProviderRegistryMethodRegisterTraceProviderName);
-    }
-}
-
-
-class TraceProviderRegistryProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  TraceProviderRegistry ptr;
-
-  TraceProviderRegistryProxy(_TraceProviderRegistryProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _TraceProviderRegistryProxyCalls(proxyImpl);
-
+class TraceProviderRegistryProxy extends bindings.Proxy
+                              implements TraceProviderRegistry {
   TraceProviderRegistryProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _TraceProviderRegistryProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _TraceProviderRegistryProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _TraceProviderRegistryProxyControl.fromEndpoint(endpoint));
 
-  TraceProviderRegistryProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _TraceProviderRegistryProxyImpl.fromHandle(handle) {
-    ptr = new _TraceProviderRegistryProxyCalls(impl);
-  }
+  TraceProviderRegistryProxy.fromHandle(core.MojoHandle handle)
+      : super(new _TraceProviderRegistryProxyControl.fromHandle(handle));
 
-  TraceProviderRegistryProxy.unbound() :
-      impl = new _TraceProviderRegistryProxyImpl.unbound() {
-    ptr = new _TraceProviderRegistryProxyCalls(impl);
+  TraceProviderRegistryProxy.unbound()
+      : super(new _TraceProviderRegistryProxyControl.unbound());
+
+  static TraceProviderRegistryProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For TraceProviderRegistryProxy"));
+    return new TraceProviderRegistryProxy.fromEndpoint(endpoint);
   }
 
   factory TraceProviderRegistryProxy.connectToService(
@@ -181,30 +158,16 @@
     return p;
   }
 
-  static TraceProviderRegistryProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For TraceProviderRegistryProxy"));
-    return new TraceProviderRegistryProxy.fromEndpoint(endpoint);
-  }
 
-  String get serviceName => TraceProviderRegistry.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "TraceProviderRegistryProxy($impl)";
+  void registerTraceProvider(Object traceProvider) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _TraceProviderRegistryRegisterTraceProviderParams();
+    params.traceProvider = traceProvider;
+    ctrl.sendMessage(params,
+        _traceProviderRegistryMethodRegisterTraceProviderName);
   }
 }
 
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 2fb3c9b..e688055 100644
--- a/mojo/dart/packages/mojo_services/lib/tracing/tracing.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/tracing/tracing.mojom.dart
@@ -386,24 +386,22 @@
 }
 
 
-class _TraceProviderProxyImpl extends bindings.Proxy {
-  _TraceProviderProxyImpl.fromEndpoint(
+class _TraceProviderProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _TraceProviderProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _TraceProviderProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _TraceProviderProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _TraceProviderProxyImpl.unbound() : super.unbound();
-
-  static _TraceProviderProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _TraceProviderProxyImpl"));
-    return new _TraceProviderProxyImpl.fromEndpoint(endpoint);
-  }
+  _TraceProviderProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _TraceProviderServiceDescription();
+      new _TraceProviderServiceDescription();
 
+  String get serviceName => TraceProvider.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -413,60 +411,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_TraceProviderProxyImpl($superString)";
+    return "_TraceProviderProxyControl($superString)";
   }
 }
 
 
-class _TraceProviderProxyCalls implements TraceProvider {
-  _TraceProviderProxyImpl _proxyImpl;
-
-  _TraceProviderProxyCalls(this._proxyImpl);
-    void startTracing(String categories, Object recorder) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _TraceProviderStartTracingParams();
-      params.categories = categories;
-      params.recorder = recorder;
-      _proxyImpl.sendMessage(params, _traceProviderMethodStartTracingName);
-    }
-    void stopTracing() {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _TraceProviderStopTracingParams();
-      _proxyImpl.sendMessage(params, _traceProviderMethodStopTracingName);
-    }
-}
-
-
-class TraceProviderProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  TraceProvider ptr;
-
-  TraceProviderProxy(_TraceProviderProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _TraceProviderProxyCalls(proxyImpl);
-
+class TraceProviderProxy extends bindings.Proxy
+                              implements TraceProvider {
   TraceProviderProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _TraceProviderProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _TraceProviderProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _TraceProviderProxyControl.fromEndpoint(endpoint));
 
-  TraceProviderProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _TraceProviderProxyImpl.fromHandle(handle) {
-    ptr = new _TraceProviderProxyCalls(impl);
-  }
+  TraceProviderProxy.fromHandle(core.MojoHandle handle)
+      : super(new _TraceProviderProxyControl.fromHandle(handle));
 
-  TraceProviderProxy.unbound() :
-      impl = new _TraceProviderProxyImpl.unbound() {
-    ptr = new _TraceProviderProxyCalls(impl);
+  TraceProviderProxy.unbound()
+      : super(new _TraceProviderProxyControl.unbound());
+
+  static TraceProviderProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For TraceProviderProxy"));
+    return new TraceProviderProxy.fromEndpoint(endpoint);
   }
 
   factory TraceProviderProxy.connectToService(
@@ -476,30 +444,26 @@
     return p;
   }
 
-  static TraceProviderProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For TraceProviderProxy"));
-    return new TraceProviderProxy.fromEndpoint(endpoint);
+
+  void startTracing(String categories, Object recorder) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _TraceProviderStartTracingParams();
+    params.categories = categories;
+    params.recorder = recorder;
+    ctrl.sendMessage(params,
+        _traceProviderMethodStartTracingName);
   }
-
-  String get serviceName => TraceProvider.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "TraceProviderProxy($impl)";
+  void stopTracing() {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _TraceProviderStopTracingParams();
+    ctrl.sendMessage(params,
+        _traceProviderMethodStopTracingName);
   }
 }
 
@@ -608,24 +572,22 @@
 }
 
 
-class _TraceRecorderProxyImpl extends bindings.Proxy {
-  _TraceRecorderProxyImpl.fromEndpoint(
+class _TraceRecorderProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _TraceRecorderProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _TraceRecorderProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _TraceRecorderProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _TraceRecorderProxyImpl.unbound() : super.unbound();
-
-  static _TraceRecorderProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _TraceRecorderProxyImpl"));
-    return new _TraceRecorderProxyImpl.fromEndpoint(endpoint);
-  }
+  _TraceRecorderProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _TraceRecorderServiceDescription();
+      new _TraceRecorderServiceDescription();
 
+  String get serviceName => TraceRecorder.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -635,51 +597,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_TraceRecorderProxyImpl($superString)";
+    return "_TraceRecorderProxyControl($superString)";
   }
 }
 
 
-class _TraceRecorderProxyCalls implements TraceRecorder {
-  _TraceRecorderProxyImpl _proxyImpl;
-
-  _TraceRecorderProxyCalls(this._proxyImpl);
-    void record(String json) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _TraceRecorderRecordParams();
-      params.json = json;
-      _proxyImpl.sendMessage(params, _traceRecorderMethodRecordName);
-    }
-}
-
-
-class TraceRecorderProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  TraceRecorder ptr;
-
-  TraceRecorderProxy(_TraceRecorderProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _TraceRecorderProxyCalls(proxyImpl);
-
+class TraceRecorderProxy extends bindings.Proxy
+                              implements TraceRecorder {
   TraceRecorderProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _TraceRecorderProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _TraceRecorderProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _TraceRecorderProxyControl.fromEndpoint(endpoint));
 
-  TraceRecorderProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _TraceRecorderProxyImpl.fromHandle(handle) {
-    ptr = new _TraceRecorderProxyCalls(impl);
-  }
+  TraceRecorderProxy.fromHandle(core.MojoHandle handle)
+      : super(new _TraceRecorderProxyControl.fromHandle(handle));
 
-  TraceRecorderProxy.unbound() :
-      impl = new _TraceRecorderProxyImpl.unbound() {
-    ptr = new _TraceRecorderProxyCalls(impl);
+  TraceRecorderProxy.unbound()
+      : super(new _TraceRecorderProxyControl.unbound());
+
+  static TraceRecorderProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For TraceRecorderProxy"));
+    return new TraceRecorderProxy.fromEndpoint(endpoint);
   }
 
   factory TraceRecorderProxy.connectToService(
@@ -689,30 +630,16 @@
     return p;
   }
 
-  static TraceRecorderProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For TraceRecorderProxy"));
-    return new TraceRecorderProxy.fromEndpoint(endpoint);
-  }
 
-  String get serviceName => TraceRecorder.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "TraceRecorderProxy($impl)";
+  void record(String json) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _TraceRecorderRecordParams();
+    params.json = json;
+    ctrl.sendMessage(params,
+        _traceRecorderMethodRecordName);
   }
 }
 
@@ -820,24 +747,22 @@
 }
 
 
-class _TraceCollectorProxyImpl extends bindings.Proxy {
-  _TraceCollectorProxyImpl.fromEndpoint(
+class _TraceCollectorProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _TraceCollectorProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _TraceCollectorProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _TraceCollectorProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _TraceCollectorProxyImpl.unbound() : super.unbound();
-
-  static _TraceCollectorProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _TraceCollectorProxyImpl"));
-    return new _TraceCollectorProxyImpl.fromEndpoint(endpoint);
-  }
+  _TraceCollectorProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _TraceCollectorServiceDescription();
+      new _TraceCollectorServiceDescription();
 
+  String get serviceName => TraceCollector.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -847,60 +772,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_TraceCollectorProxyImpl($superString)";
+    return "_TraceCollectorProxyControl($superString)";
   }
 }
 
 
-class _TraceCollectorProxyCalls implements TraceCollector {
-  _TraceCollectorProxyImpl _proxyImpl;
-
-  _TraceCollectorProxyCalls(this._proxyImpl);
-    void start(core.MojoDataPipeProducer stream, String categories) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _TraceCollectorStartParams();
-      params.stream = stream;
-      params.categories = categories;
-      _proxyImpl.sendMessage(params, _traceCollectorMethodStartName);
-    }
-    void stopAndFlush() {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new _TraceCollectorStopAndFlushParams();
-      _proxyImpl.sendMessage(params, _traceCollectorMethodStopAndFlushName);
-    }
-}
-
-
-class TraceCollectorProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  TraceCollector ptr;
-
-  TraceCollectorProxy(_TraceCollectorProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _TraceCollectorProxyCalls(proxyImpl);
-
+class TraceCollectorProxy extends bindings.Proxy
+                              implements TraceCollector {
   TraceCollectorProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _TraceCollectorProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _TraceCollectorProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _TraceCollectorProxyControl.fromEndpoint(endpoint));
 
-  TraceCollectorProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _TraceCollectorProxyImpl.fromHandle(handle) {
-    ptr = new _TraceCollectorProxyCalls(impl);
-  }
+  TraceCollectorProxy.fromHandle(core.MojoHandle handle)
+      : super(new _TraceCollectorProxyControl.fromHandle(handle));
 
-  TraceCollectorProxy.unbound() :
-      impl = new _TraceCollectorProxyImpl.unbound() {
-    ptr = new _TraceCollectorProxyCalls(impl);
+  TraceCollectorProxy.unbound()
+      : super(new _TraceCollectorProxyControl.unbound());
+
+  static TraceCollectorProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For TraceCollectorProxy"));
+    return new TraceCollectorProxy.fromEndpoint(endpoint);
   }
 
   factory TraceCollectorProxy.connectToService(
@@ -910,30 +805,26 @@
     return p;
   }
 
-  static TraceCollectorProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For TraceCollectorProxy"));
-    return new TraceCollectorProxy.fromEndpoint(endpoint);
+
+  void start(core.MojoDataPipeProducer stream, String categories) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _TraceCollectorStartParams();
+    params.stream = stream;
+    params.categories = categories;
+    ctrl.sendMessage(params,
+        _traceCollectorMethodStartName);
   }
-
-  String get serviceName => TraceCollector.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "TraceCollectorProxy($impl)";
+  void stopAndFlush() {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new _TraceCollectorStopAndFlushParams();
+    ctrl.sendMessage(params,
+        _traceCollectorMethodStopAndFlushName);
   }
 }
 
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 3231af0..1afee66 100644
--- a/mojo/dart/packages/mojo_services/lib/vsync/vsync.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/vsync/vsync.mojom.dart
@@ -158,24 +158,22 @@
 }
 
 
-class _VSyncProviderProxyImpl extends bindings.Proxy {
-  _VSyncProviderProxyImpl.fromEndpoint(
+class _VSyncProviderProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _VSyncProviderProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _VSyncProviderProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _VSyncProviderProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _VSyncProviderProxyImpl.unbound() : super.unbound();
-
-  static _VSyncProviderProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _VSyncProviderProxyImpl"));
-    return new _VSyncProviderProxyImpl.fromEndpoint(endpoint);
-  }
+  _VSyncProviderProxyControl.unbound() : super.unbound();
 
   service_describer.ServiceDescription get serviceDescription =>
-    new _VSyncProviderServiceDescription();
+      new _VSyncProviderServiceDescription();
 
+  String get serviceName => VSyncProvider.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _vSyncProviderMethodAwaitVSyncName:
@@ -205,50 +203,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_VSyncProviderProxyImpl($superString)";
+    return "_VSyncProviderProxyControl($superString)";
   }
 }
 
 
-class _VSyncProviderProxyCalls implements VSyncProvider {
-  _VSyncProviderProxyImpl _proxyImpl;
-
-  _VSyncProviderProxyCalls(this._proxyImpl);
-    dynamic awaitVSync([Function responseFactory = null]) {
-      var params = new _VSyncProviderAwaitVSyncParams();
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _vSyncProviderMethodAwaitVSyncName,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-}
-
-
-class VSyncProviderProxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  VSyncProvider ptr;
-
-  VSyncProviderProxy(_VSyncProviderProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _VSyncProviderProxyCalls(proxyImpl);
-
+class VSyncProviderProxy extends bindings.Proxy
+                              implements VSyncProvider {
   VSyncProviderProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _VSyncProviderProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _VSyncProviderProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _VSyncProviderProxyControl.fromEndpoint(endpoint));
 
-  VSyncProviderProxy.fromHandle(core.MojoHandle handle) :
-      impl = new _VSyncProviderProxyImpl.fromHandle(handle) {
-    ptr = new _VSyncProviderProxyCalls(impl);
-  }
+  VSyncProviderProxy.fromHandle(core.MojoHandle handle)
+      : super(new _VSyncProviderProxyControl.fromHandle(handle));
 
-  VSyncProviderProxy.unbound() :
-      impl = new _VSyncProviderProxyImpl.unbound() {
-    ptr = new _VSyncProviderProxyCalls(impl);
+  VSyncProviderProxy.unbound()
+      : super(new _VSyncProviderProxyControl.unbound());
+
+  static VSyncProviderProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For VSyncProviderProxy"));
+    return new VSyncProviderProxy.fromEndpoint(endpoint);
   }
 
   factory VSyncProviderProxy.connectToService(
@@ -258,30 +236,14 @@
     return p;
   }
 
-  static VSyncProviderProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For VSyncProviderProxy"));
-    return new VSyncProviderProxy.fromEndpoint(endpoint);
-  }
 
-  String get serviceName => VSyncProvider.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
-  }
-
-  String toString() {
-    return "VSyncProviderProxy($impl)";
+  dynamic awaitVSync([Function responseFactory = null]) {
+    var params = new _VSyncProviderAwaitVSyncParams();
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _vSyncProviderMethodAwaitVSyncName,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
 }
 
diff --git a/mojo/dart/unittests/embedder_tests/bindings_generation_test.dart b/mojo/dart/unittests/embedder_tests/bindings_generation_test.dart
index efc3bf7..e3fb3ec 100644
--- a/mojo/dart/unittests/embedder_tests/bindings_generation_test.dart
+++ b/mojo/dart/unittests/embedder_tests/bindings_generation_test.dart
@@ -58,10 +58,10 @@
   var client = new sample.ProviderProxy.fromEndpoint(pipe.endpoints[0]);
   var c = new Completer();
   Isolate.spawn(providerIsolate, pipe.endpoints[1]).then((_) {
-    client.ptr.echoString("hello!").then((echoStringResponse) {
+    client.echoString("hello!").then((echoStringResponse) {
       Expect.equals("hello!", echoStringResponse.a);
     }).then((_) {
-      client.ptr.echoStrings("hello", "mojo!").then((echoStringsResponse) {
+      client.echoStrings("hello", "mojo!").then((echoStringsResponse) {
         Expect.equals("hello", echoStringsResponse.a);
         Expect.equals("mojo!", echoStringsResponse.b);
         client.close().then((_) {
@@ -78,10 +78,10 @@
   var client = new sample.ProviderProxy.fromEndpoint(pipe.endpoints[0]);
   var isolate = await Isolate.spawn(providerIsolate, pipe.endpoints[1]);
 
-  var echoStringResponse = await client.ptr.echoString("hello!");
+  var echoStringResponse = await client.echoString("hello!");
   Expect.equals("hello!", echoStringResponse.a);
 
-  var echoStringsResponse = await client.ptr.echoStrings("hello", "mojo!");
+  var echoStringsResponse = await client.echoStrings("hello", "mojo!");
   Expect.equals("hello", echoStringsResponse.a);
   Expect.equals("mojo!", echoStringsResponse.b);
 
@@ -283,7 +283,7 @@
       new regression.CheckEnumCapsProxy.fromEndpoint(pipe.endpoints[0]);
   var c = new Completer();
   Isolate.spawn(checkEnumCapsIsolate, pipe.endpoints[1]).then((_) {
-    client.ptr.setEnumWithInternalAllCaps(
+    client.setEnumWithInternalAllCaps(
         regression.EnumWithInternalAllCaps.standard);
     client.close().then((_) {
       c.complete(null);
@@ -320,7 +320,7 @@
   var testCompleter = new Completer();
   var pipe = new core.MojoMessagePipe();
   var proxy = new sample.ProviderProxy.fromEndpoint(pipe.endpoints[0]);
-  proxy.impl.onError = (_) => testCompleter.complete(true);
+  proxy.ctrl.onError = (_) => testCompleter.complete(true);
   Isolate.spawn(closingProviderIsolate, pipe.endpoints[1]);
   return testCompleter.future.then((b) {
     Expect.isTrue(b);
@@ -347,7 +347,7 @@
   var client = new regression.Regression551Proxy.fromEndpoint(pipe.endpoints[0]);
   var c = new Completer();
   Isolate.spawn(regression551Isolate, pipe.endpoints[1]).then((_) {
-    client.ptr.get(["hello!"]).then((response) {
+    client.get(["hello!"]).then((response) {
       Expect.equals(0, response.result);
       client.close().then((_) {
         c.complete(true);
@@ -377,7 +377,7 @@
   var client = new regression.ServiceNameProxy.fromEndpoint(pipe.endpoints[0]);
   var c = new Completer();
   Isolate.spawn(serviceNameIsolate, pipe.endpoints[1]).then((_) {
-    client.ptr.serviceName_().then((response) {
+    client.serviceName_().then((response) {
       Expect.equals(ServiceName.serviceName, response.serviceName_);
       client.close().then((_) {
         c.complete(true);
@@ -654,13 +654,13 @@
   _checkMojomInterface(mi, shortName, fullIdentifier, methodMap);
 
   // The proxy and stub need to have a valid serviceDescription.
-  var boundsCheckProxyImpl =
-      new validation.BoundsCheckTestInterfaceProxy.unbound().impl;
+  var boundsCheckProxyController =
+      new validation.BoundsCheckTestInterfaceProxy.unbound().ctrl;
   var boundsCheckStubDescription =
       validation.BoundsCheckTestInterfaceStub.serviceDescription;
 
   _checkServiceDescription(
-      boundsCheckProxyImpl.serviceDescription, interfaceID, shortName,
+      boundsCheckProxyController.serviceDescription, interfaceID, shortName,
       fullIdentifier, methodMap);
   _checkServiceDescription(
       boundsCheckStubDescription, interfaceID, shortName, fullIdentifier,
diff --git a/mojo/dart/unittests/embedder_tests/control_messages_test.dart b/mojo/dart/unittests/embedder_tests/control_messages_test.dart
index 8653ce9..08eb8ac 100644
--- a/mojo/dart/unittests/embedder_tests/control_messages_test.dart
+++ b/mojo/dart/unittests/embedder_tests/control_messages_test.dart
@@ -50,23 +50,23 @@
   var ps = buildConnectedProxyAndStub();
   var proxy = ps[0];
   // The version starts at 0.
-  Expect.equals(0, proxy.version);
+  Expect.equals(0, proxy.ctrl.version);
   // We are talking to an implementation that supports version maxVersion.
-  var providedVersion = await proxy.queryVersion();
+  var providedVersion = await proxy.ctrl.queryVersion();
   Expect.equals(maxVersion, providedVersion);
   // The proxy's version has been updated.
-  Expect.equals(providedVersion, proxy.version);
+  Expect.equals(providedVersion, proxy.ctrl.version);
   closeProxyAndStub(ps);
 }
 
 testRequireVersionSuccess() async {
   var ps = buildConnectedProxyAndStub();
   var proxy = ps[0];
-  Expect.equals(0, proxy.version);
+  Expect.equals(0, proxy.ctrl.version);
   // Require version maxVersion.
-  proxy.requireVersion(maxVersion);
+  proxy.ctrl.requireVersion(maxVersion);
   // Make a request and get a response.
-  var response = await proxy.ptr.getInteger();
+  var response = await proxy.getInteger();
   Expect.equals(0, response.data);
   closeProxyAndStub(ps);
 }
@@ -74,23 +74,23 @@
 testRequireVersionDisconnect() async {
   var ps = buildConnectedProxyAndStub();
   var proxy = ps[0];
-  Expect.equals(0, proxy.version);
+  Expect.equals(0, proxy.ctrl.version);
   // Require version maxVersion.
-  proxy.requireVersion(maxVersion);
-  Expect.equals(maxVersion, proxy.version);
+  proxy.ctrl.requireVersion(maxVersion);
+  Expect.equals(maxVersion, proxy.ctrl.version);
   // Set integer.
-  proxy.ptr.setInteger(34, sample.Enum.value);
+  proxy.setInteger(34, sample.Enum.value);
   // Get integer.
-  var response = await proxy.ptr.getInteger();
+  var response = await proxy.getInteger();
   Expect.equals(34, response.data);
   // Require version maxVersion + 1
-  proxy.requireVersion(maxVersion + 1);
+  proxy.ctrl.requireVersion(maxVersion + 1);
   // Version number is updated synchronously.
-  Expect.equals(maxVersion + 1, proxy.version);
+  Expect.equals(maxVersion + 1, proxy.ctrl.version);
   // Get integer, expect a failure.
   bool exceptionCaught = false;
   try {
-    response = await proxy.ptr.getInteger();
+    response = await proxy.getInteger();
     Expect.fail('Should have an exception.');
   } catch(e) {
     exceptionCaught = true;
diff --git a/mojo/dart/unittests/embedder_tests/dart_to_cpp_tests.dart b/mojo/dart/unittests/embedder_tests/dart_to_cpp_tests.dart
index 5f0764a..5b32a37 100644
--- a/mojo/dart/unittests/embedder_tests/dart_to_cpp_tests.dart
+++ b/mojo/dart/unittests/embedder_tests/dart_to_cpp_tests.dart
@@ -43,14 +43,14 @@
     });
   }
 
-  void setClient(bindings.ProxyBase proxy) {
+  void setClient(bindings.Proxy proxy) {
     assert(cppSide == null);
     cppSide = proxy;
-    cppSide.ptr.startTest();
+    cppSide.startTest();
   }
 
   void ping() {
-    cppSide.ptr.pingResponse();
+    cppSide.pingResponse();
     _completer.complete(null);
     cppSide.close();
   }
@@ -92,14 +92,14 @@
       messagePipe1.endpoints[1].write(_sampleMessage.buffer.asByteData());
       messagePipe2.endpoints[1].write(_sampleMessage.buffer.asByteData());
 
-      cppSide.ptr.echoResponse(createEchoArgsList([arg, specialArg]));
+      cppSide.echoResponse(createEchoArgsList([arg, specialArg]));
 
       dataPipe1.producer.handle.close();
       dataPipe2.producer.handle.close();
       messagePipe1.endpoints[1].handle.close();
       messagePipe2.endpoints[1].handle.close();
     }
-    cppSide.ptr.testFinished();
+    cppSide.testFinished();
     _completer.complete(null);
     cppSide.close();
   }
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 ea235b9..d1713fd 100644
--- a/mojo/public/tools/bindings/generators/dart_templates/interface_definition.tmpl
+++ b/mojo/public/tools/bindings/generators/dart_templates/interface_definition.tmpl
@@ -63,24 +63,22 @@
 }
 
 
-class _{{interface|name}}ProxyImpl extends bindings.Proxy {
-  _{{interface|name}}ProxyImpl.fromEndpoint(
+class _{{interface|name}}ProxyControl extends bindings.ProxyMessageHandler
+                                      implements bindings.ProxyControl {
+  _{{interface|name}}ProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  _{{interface|name}}ProxyImpl.fromHandle(core.MojoHandle handle) :
-      super.fromHandle(handle);
+  _{{interface|name}}ProxyControl.fromHandle(
+      core.MojoHandle handle) : super.fromHandle(handle);
 
-  _{{interface|name}}ProxyImpl.unbound() : super.unbound();
-
-  static _{{interface|name}}ProxyImpl newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For _{{interface|name}}ProxyImpl"));
-    return new _{{interface|name}}ProxyImpl.fromEndpoint(endpoint);
-  }
+  _{{interface|name}}ProxyControl.unbound() : super.unbound();
 
   {{descpkg}}ServiceDescription get serviceDescription =>
-    new _{{interface|name}}ServiceDescription();
+      new _{{interface|name}}ServiceDescription();
 
+  String get serviceName => {{interface|name}}.serviceName;
+
+  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
 {%- for method in interface.methods %}
@@ -115,84 +113,30 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "_{{interface|name}}ProxyImpl($superString)";
+    return "_{{interface|name}}ProxyControl($superString)";
   }
 }
 
 
-class _{{interface|name}}ProxyCalls implements {{interface|name}} {
-  {%- if interface.methods %}
-  _{{interface|name}}ProxyImpl _proxyImpl;
-
-  _{{interface|name}}ProxyCalls(this._proxyImpl);
-  {%- else %}
-  _{{interface|name}}ProxyCalls(_{{interface|name}}ProxyImpl _);
-  {%- endif %}
-
-  {%- 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 -%}
-  {%- set request_struct = method.param_struct -%}
-    ) {
-      if (!_proxyImpl.isBound) {
-        _proxyImpl.proxyError("The Proxy is closed.");
-        return;
-      }
-      var params = new {{request_struct|name}}();
-  {%- for parameter in method.parameters %}
-      params.{{parameter|name}} = {{parameter|name}};
-  {%- endfor %}
-      _proxyImpl.sendMessage(params, _{{interface|name|lower_camel}}Method{{method|name|upper_camel}}Name);
-    }
-  {%- else %}
-  {%- set request_struct = method.param_struct %}
-    dynamic {{method|name}}(
-  {%- for parameter in method.parameters -%}
-      {{parameter.kind|dart_type}} {{parameter|name}},
-  {%- endfor -%}
-      [Function responseFactory = null]) {
-      var params = new {{request_struct|name}}();
-  {%- for parameter in method.parameters %}
-      params.{{parameter|name}} = {{parameter|name}};
-  {%- endfor %}
-      return _proxyImpl.sendMessageWithRequestId(
-          params,
-          _{{interface|name|lower_camel}}Method{{method|name|upper_camel}}Name,
-          -1,
-          bindings.MessageHeader.kMessageExpectsResponse);
-    }
-  {%- endif %}
-  {%- endfor %}
-}
-
-
-class {{interface|name}}Proxy implements bindings.ProxyBase {
-  final bindings.Proxy impl;
-  {{interface|name}} ptr;
-
-  {{interface|name}}Proxy(_{{interface|name}}ProxyImpl proxyImpl) :
-      impl = proxyImpl,
-      ptr = new _{{interface|name}}ProxyCalls(proxyImpl);
-
+class {{interface|name}}Proxy extends bindings.Proxy
+                              implements {{interface|name}} {
   {{interface|name}}Proxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) :
-      impl = new _{{interface|name}}ProxyImpl.fromEndpoint(endpoint) {
-    ptr = new _{{interface|name}}ProxyCalls(impl);
-  }
+      core.MojoMessagePipeEndpoint endpoint)
+      : super(new _{{interface|name}}ProxyControl.fromEndpoint(endpoint));
 
-  {{interface|name}}Proxy.fromHandle(core.MojoHandle handle) :
-      impl = new _{{interface|name}}ProxyImpl.fromHandle(handle) {
-    ptr = new _{{interface|name}}ProxyCalls(impl);
-  }
+  {{interface|name}}Proxy.fromHandle(core.MojoHandle handle)
+      : super(new _{{interface|name}}ProxyControl.fromHandle(handle));
 
-  {{interface|name}}Proxy.unbound() :
-      impl = new _{{interface|name}}ProxyImpl.unbound() {
-    ptr = new _{{interface|name}}ProxyCalls(impl);
+  {{interface|name}}Proxy.unbound()
+      : super(new _{{interface|name}}ProxyControl.unbound());
+
+  static {{interface|name}}Proxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For {{interface|name}}Proxy"));
+    return new {{interface|name}}Proxy.fromEndpoint(endpoint);
   }
 
   factory {{interface|name}}Proxy.connectToService(
@@ -202,31 +146,44 @@
     return p;
   }
 
-  static {{interface|name}}Proxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For {{interface|name}}Proxy"));
-    return new {{interface|name}}Proxy.fromEndpoint(endpoint);
+{% 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 -%}
+{%- set request_struct = method.param_struct -%}
+  ) {
+    if (!ctrl.isBound) {
+      ctrl.proxyError("The Proxy is closed.");
+      return;
+    }
+    var params = new {{request_struct|name}}();
+{%- for parameter in method.parameters %}
+    params.{{parameter|name}} = {{parameter|name}};
+{%- endfor %}
+    ctrl.sendMessage(params,
+        _{{interface|name|lower_camel}}Method{{method|name|upper_camel}}Name);
   }
-
-  String get serviceName => {{interface|name}}.serviceName;
-
-  Future close({bool immediate: false}) => impl.close(immediate: immediate);
-
-  Future responseOrError(Future f) => impl.responseOrError(f);
-
-  Future get errorFuture => impl.errorFuture;
-
-  int get version => impl.version;
-
-  Future<int> queryVersion() => impl.queryVersion();
-
-  void requireVersion(int requiredVersion) {
-    impl.requireVersion(requiredVersion);
+{%- else %}
+{%- set request_struct = method.param_struct %}
+  dynamic {{method|name}}(
+{%- for parameter in method.parameters -%}
+    {{parameter.kind|dart_type}} {{parameter|name}},
+{%- endfor -%}
+    [Function responseFactory = null]) {
+    var params = new {{request_struct|name}}();
+{%- for parameter in method.parameters %}
+    params.{{parameter|name}} = {{parameter|name}};
+{%- endfor %}
+    return ctrl.sendMessageWithRequestId(
+        params,
+        _{{interface|name|lower_camel}}Method{{method|name|upper_camel}}Name,
+        -1,
+        bindings.MessageHeader.kMessageExpectsResponse);
   }
-
-  String toString() {
-    return "{{interface|name}}Proxy($impl)";
-  }
+{%- 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 5dbc1ba..7c2a15c 100644
--- a/mojo/public/tools/bindings/generators/mojom_dart_generator.py
+++ b/mojo/public/tools/bindings/generators/mojom_dart_generator.py
@@ -20,12 +20,12 @@
 GENERATOR_PREFIX = 'dart'
 
 # CAUTION: To generate Dart-style names, and to avoid generating reserved words
-# for identifiers. The template files should generate names using
+# for identifiers, the template files should generate names using
 # {{element|name}}, not {{element.name}}.
 
 # Dart reserved words from:
 # http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-408.pdf
-# We must not generated reserved words for identifiers.
+# We must not generate reserved words for identifiers.
 # NB: async, await, and yield are not technically reserved words, but since
 # they are not valid identifiers in all contexts, we include them here as well.
 _dart_reserved_words = [
@@ -67,8 +67,20 @@
   "yield",
 ]
 
+# These names are the class fields and methods of the Proxy class in
+# lib/src/proxy.dart of Dart's mojo package. If these names appear in a .mojom
+# they must be mangled to avoid name conflicts. They are mangled by appending
+# an underscore ('_'), which is banned on names in mojom interfaces.
 _reserved_words = _dart_reserved_words + [
+  "close",
+  "connectToService",
+  "ctrl",
+  "fromEndpoint",
+  "fromHandle",
+  "newFromEndpoint",
+  "responseOrError",
   "serviceName",
+  "unbound",
 ]
 
 _kind_to_dart_default_value = {