Check in generated Dart bindings and add presubmit script

- Add mojom_list_dart_outputs.py script which outputs the path to the generated bindings file, for example:

Given a foo.mojom file with the following:

[DartPackage="mojo_services"]
module mojo;

The output path is: mojo_services/lib/mojo/foo.mojom.dart

- Add check_mojom_dart.py script which verifies that the generated bindings in the source tree are updated with respect to their .mojom sources.

- Fix mojom generate.dart script to guess when the mojo/services import path is needed.
- Fix mojom generate.dart script to better handle case of missing lib/ directory.

---- Example output #1:

$ ./mojo/dart/tools/presubmit/check_mojom_dart.py
Package mojo_services missing mojo_services/lib/mojo/web_socket.mojom.dart
Package mojo_services missing mojo_services/lib/mojo/command_buffer.mojom.dart
Package mojo_services missing mojo_services/lib/mojo/native_viewport.mojom.dart
Package mojo_services missing mojo_services/lib/http_server/http_request.mojom.dart
Package mojo_services missing mojo_services/lib/mojo/view_manager.mojom.dart
Package mojo_services missing mojo_services/lib/mojo/geocoder.mojom.dart
Package mojo_services missing mojo_services/lib/mojo/ui/view_manager.mojom.dart
Package mojo_services missing mojo_services/lib/mojo/http_message.mojom.dart
Package mojo_services missing mojo_services/lib/mojo/url_response_disk_cache.mojom.dart
Package mojo_services missing mojo_services/lib/mojo/surface_id.mojom.dart
Package mojo_services missing mojo_services/lib/mojo/viewport_parameter_listener.mojom.dart
Package mojo_services missing mojo_services/lib/mojo/service_registry.mojom.dart
Package mojo_services missing mojo_services/lib/mojo/ui/layouts.mojom.dart
Package mojo_services missing mojo_services/lib/mojo/ui/view_trees.mojom.dart
Package mojo_services missing mojo_services/lib/mojo/input_event_constants.mojom.dart
Package mojo_services missing mojo_services/lib/mojo/sharing.mojom.dart
Package mojo_services missing mojo_services/lib/mojo/display.mojom.dart
Package mojo_services missing mojo_services/lib/mojo/tcp_server_socket.mojom.dart
Package mojo_services missing mojo_services/lib/keyboard/keyboard.mojom.dart
Package mojo_services missing mojo_services/lib/input/input.mojom.dart
Package mojo_services missing mojo_services/lib/mojo/location_service.mojom.dart
Package mojo_services missing mojo_services/lib/mojo/surfaces.mojom.dart
Package mojo_services missing mojo_services/lib/mojo/host_resolver.mojom.dart
Package mojo_services missing mojo_services/lib/mojo/navigation.mojom.dart
Package mojo_services missing mojo_services/lib/mojo/window_manager_internal.mojom.dart
Package mojo_services missing mojo_services/lib/http_server/http_server.mojom.dart
Package mojo_services missing mojo_services/lib/contacts/contacts.mojom.dart
Package mojo_services missing mojo_services/lib/speech_recognizer/speech_recognizer.mojom.dart
Package mojo_services missing mojo_services/lib/mojo/files/ioctl_terminal.mojom.dart
Package mojo_services missing mojo_services/lib/mojo/http_server.mojom.dart
Package mojo_services missing mojo_services/lib/mojo/http_connection.mojom.dart
Package mojo_services missing mojo_services/lib/mojo/udp_socket.mojom.dart
Package mojo_services missing mojo_services/lib/mojo/input_events.mojom.dart
Package mojo_services missing mojo_services/lib/icu_data/icu_data.mojom.dart
Package mojo_services missing mojo_services/lib/prediction/prediction.mojom.dart
Package mojo_services missing mojo_services/lib/sensors/sensors.mojom.dart
Package mojo_services missing mojo_services/lib/mojo/files/directory.mojom.dart
Package mojo_services missing mojo_services/lib/mojo/gpu.mojom.dart
Package mojo_services missing mojo_services/lib/mojo/files/types.mojom.dart
Package mojo_services missing mojo_services/lib/mojo/url_loader_interceptor.mojom.dart
Package mojo_services missing mojo_services/lib/http_server/http_server_factory.mojom.dart
Package mojo_services missing mojo_services/lib/notifications/notifications.mojom.dart
Package mojo_services missing mojo_services/lib/mojo/gpu_capabilities.mojom.dart
Package mojo_services missing mojo_services/lib/mojo/window_manager.mojom.dart
Package mojo_services missing mojo_services/lib/mojo/quads.mojom.dart
Package mojo_services missing mojo_services/lib/mojo/camera.mojom.dart
Package mojo_services missing mojo_services/lib/mojo/view_manager_constants.mojom.dart
Package mojo_services missing mojo_services/lib/mojo/files/ioctl.mojom.dart
Package mojo_services missing mojo_services/lib/mojo/files/files.mojom.dart
Package mojo_services missing mojo_services/lib/http_server/http_response.mojom.dart
Package mojo_services missing mojo_services/lib/mojo/context_provider.mojom.dart
Package mojo_services missing mojo_services/lib/native_support/process.mojom.dart
Package mojo_services missing mojo_services/lib/mojo/terminal/terminal_client.mojom.dart
Package mojo_services missing mojo_services/lib/mojo/geometry.mojom.dart
Package mojo_services missing mojo_services/lib/mojo/clipboard.mojom.dart
Package mojo_services missing mojo_services/lib/mojo/terminal/terminal.mojom.dart
Package mojo_services missing mojo_services/lib/mojo/url_loader.mojom.dart
Package mojo_services missing mojo_services/lib/mojo/asset_bundle/asset_bundle.mojom.dart
Package mojo_services missing mojo_services/lib/mojo/authenticating_url_loader_interceptor_meta_factory.mojom.dart
Package mojo_services missing mojo_services/lib/mojo/device_info.mojom.dart
Package mojo_services missing mojo_services/lib/mojo/cookie_store.mojom.dart
Package mojo_services missing mojo_services/lib/mojo/location.mojom.dart
Package mojo_services missing mojo_services/lib/mojo/animations.mojom.dart
Package mojo_services missing mojo_services/lib/mojo/ui/views.mojom.dart
Package mojo_services missing mojo_services/lib/mojo/tcp_bound_socket.mojom.dart
Package mojo_services missing mojo_services/lib/mojo/ui/view_provider.mojom.dart
Package mojo_services missing mojo_services/lib/mojo/input_key_codes.mojom.dart
Package mojo_services missing mojo_services/lib/mojo/tcp_connected_socket.mojom.dart
Package mojo_services missing mojo_services/lib/mojo/content_handler.mojom.dart
Package mojo_services missing mojo_services/lib/nfc/nfc.mojom.dart
Package mojo_services missing mojo_services/lib/mojo/network_service.mojom.dart
Package mojo_services missing mojo_services/lib/mojo/files/file.mojom.dart
Package mojo_services missing mojo_services/lib/authentication/authentication.mojom.dart
Package mojo_services missing mojo_services/lib/tracing/tracing.mojom.dart
Package mojo_services missing mojo_services/lib/mojo/net_address.mojom.dart
*** Dart Generated Bindings Check Failed:
You must regenerate bindings for mojo_services.
From the src directory, run:
$ dart mojo/dart/packages/mojom/bin/mojom.dart gen -m mojo/public -r mojo/ --output mojo/dart/packages/
Package mojo missing mojo/lib/mojo/url_response.mojom.dart
Package mojo missing mojo/lib/mojo/interface_control_messages.mojom.dart
Package mojo missing mojo/lib/mojo/http_header.mojom.dart
Package mojo missing mojo/lib/mojo/service_provider.mojom.dart
Package mojo missing mojo/lib/mojo/application.mojom.dart
Package mojo missing mojo/lib/mojo/shell.mojom.dart
Package mojo missing mojo/lib/mojo/url_request.mojom.dart
Package mojo missing mojo/lib/mojo/network_error.mojom.dart
*** Dart Generated Bindings Check Failed:
You must regenerate bindings for mojo.
From the src directory, run:
$ dart mojo/dart/packages/mojom/bin/mojom.dart gen -m mojo/public -r mojo/ --output mojo/dart/packages/

--- Example output #2 (after touching application.mojom):

$ ./mojo/dart/tools/presubmit/check_mojom_dart.py
Package mojo has old mojo/lib/mojo/application.mojom.dart
*** Dart Generated Bindings Check Failed:
You must regenerate bindings for mojo.
From the src directory, run:
$ dart mojo/dart/packages/mojom/bin/mojom.dart gen -m mojo/public -r mojo/ --output mojo/dart/packages/

R=jamesr@chromium.org

Review URL: https://codereview.chromium.org/1449203002 .
diff --git a/PRESUBMIT.py b/PRESUBMIT.py
index 30f1151..d2391d0 100644
--- a/PRESUBMIT.py
+++ b/PRESUBMIT.py
@@ -1063,11 +1063,30 @@
   return errors
 
 
+def _CheckDartBindings(input_api, output_api):
+  """Check that generated .mojom.dart files are current"""
+  args = [input_api.python_executable,
+          'mojo/dart/tools/presubmit/check_mojom_dart.py',
+          '--affected-files']
+  files = []
+  for f in input_api.AffectedFiles():
+    files.append(f.LocalPath())
+  args.extend(files)
+  try:
+    input_api.subprocess.check_output(args)
+    return []
+  except input_api.subprocess.CalledProcessError, error:
+    return [output_api.PresubmitError(
+        'Dart bindings need to be updated.',
+        long_text=error.output)]
+
+
 def CheckChangeOnUpload(input_api, output_api):
   results = []
   results.extend(_CommonChecks(input_api, output_api))
   results.extend(_CheckValidHostsInDEPS(input_api, output_api))
   results.extend(_CheckJavaStyle(input_api, output_api))
+  results.extend(_CheckDartBindings(input_api, output_api))
   results.extend(
       input_api.canned_checks.CheckGNFormatted(input_api, output_api))
   return results
diff --git a/mojo/dart/packages/mojo/lib/mojo/application.mojom.dart b/mojo/dart/packages/mojo/lib/mojo/application.mojom.dart
new file mode 100644
index 0000000..872c0c1
--- /dev/null
+++ b/mojo/dart/packages/mojo/lib/mojo/application.mojom.dart
@@ -0,0 +1,476 @@
+// 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.
+
+library application_mojom;
+
+import 'dart:async';
+
+import 'package:mojo/bindings.dart' as bindings;
+import 'package:mojo/core.dart' as core;
+import 'package:mojo/mojo/service_provider.mojom.dart' as service_provider_mojom;
+import 'package:mojo/mojo/shell.mojom.dart' as shell_mojom;
+
+
+
+class ApplicationInitializeParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(32, 0)
+  ];
+  Object shell = null;
+  List<String> args = null;
+  String url = null;
+
+  ApplicationInitializeParams() : super(kVersions.last.size);
+
+  static ApplicationInitializeParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ApplicationInitializeParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ApplicationInitializeParams result = new ApplicationInitializeParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.shell = decoder0.decodeServiceInterface(8, false, shell_mojom.ShellProxy.newFromEndpoint);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(16, true);
+      if (decoder1 == null) {
+        result.args = null;
+      } else {
+        var si1 = decoder1.decodeDataHeaderForPointerArray(bindings.kUnspecifiedArrayLength);
+        result.args = new List<String>(si1.numElements);
+        for (int i1 = 0; i1 < si1.numElements; ++i1) {
+          
+          result.args[i1] = decoder1.decodeString(bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i1, false);
+        }
+      }
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.url = decoder0.decodeString(24, false);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeInterface(shell, 8, false);
+    
+    if (args == null) {
+      encoder0.encodeNullPointer(16, true);
+    } else {
+      var encoder1 = encoder0.encodePointerArray(args.length, 16, bindings.kUnspecifiedArrayLength);
+      for (int i0 = 0; i0 < args.length; ++i0) {
+        
+        encoder1.encodeString(args[i0], bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i0, false);
+      }
+    }
+    
+    encoder0.encodeString(url, 24, false);
+  }
+
+  String toString() {
+    return "ApplicationInitializeParams("
+           "shell: $shell" ", "
+           "args: $args" ", "
+           "url: $url" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+
+class ApplicationAcceptConnectionParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(40, 0)
+  ];
+  String requestorUrl = null;
+  Object services = null;
+  Object exposedServices = null;
+  String resolvedUrl = null;
+
+  ApplicationAcceptConnectionParams() : super(kVersions.last.size);
+
+  static ApplicationAcceptConnectionParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ApplicationAcceptConnectionParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ApplicationAcceptConnectionParams result = new ApplicationAcceptConnectionParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.requestorUrl = decoder0.decodeString(8, false);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.services = decoder0.decodeInterfaceRequest(16, true, service_provider_mojom.ServiceProviderStub.newFromEndpoint);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.exposedServices = decoder0.decodeServiceInterface(20, true, service_provider_mojom.ServiceProviderProxy.newFromEndpoint);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.resolvedUrl = decoder0.decodeString(32, false);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeString(requestorUrl, 8, false);
+    
+    encoder0.encodeInterfaceRequest(services, 16, true);
+    
+    encoder0.encodeInterface(exposedServices, 20, true);
+    
+    encoder0.encodeString(resolvedUrl, 32, false);
+  }
+
+  String toString() {
+    return "ApplicationAcceptConnectionParams("
+           "requestorUrl: $requestorUrl" ", "
+           "services: $services" ", "
+           "exposedServices: $exposedServices" ", "
+           "resolvedUrl: $resolvedUrl" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+
+class ApplicationRequestQuitParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(8, 0)
+  ];
+
+  ApplicationRequestQuitParams() : super(kVersions.last.size);
+
+  static ApplicationRequestQuitParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ApplicationRequestQuitParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ApplicationRequestQuitParams result = new ApplicationRequestQuitParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    encoder.getStructEncoderAtOffset(kVersions.last);
+  }
+
+  String toString() {
+    return "ApplicationRequestQuitParams("")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    return map;
+  }
+}
+
+const int kApplication_initialize_name = 0;
+const int kApplication_acceptConnection_name = 1;
+const int kApplication_requestQuit_name = 2;
+
+const String ApplicationName =
+      'mojo::Application';
+
+abstract class Application {
+  void initialize(Object shell, List<String> args, String url);
+  void acceptConnection(String requestorUrl, Object services, Object exposedServices, String resolvedUrl);
+  void requestQuit();
+
+}
+
+
+class ApplicationProxyImpl extends bindings.Proxy {
+  ApplicationProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  ApplicationProxyImpl.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);
+  }
+
+  String get name => ApplicationName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "ApplicationProxyImpl($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, kApplication_initialize_name);
+    }
+  
+    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, kApplication_acceptConnection_name);
+    }
+  
+    void requestQuit() {
+      if (!_proxyImpl.isBound) {
+        _proxyImpl.proxyError("The Proxy is closed.");
+        return;
+      }
+      var params = new ApplicationRequestQuitParams();
+      _proxyImpl.sendMessage(params, kApplication_requestQuit_name);
+    }
+  
+}
+
+
+class ApplicationProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  Application ptr;
+  final String name = ApplicationName;
+
+  ApplicationProxy(ApplicationProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _ApplicationProxyCalls(proxyImpl);
+
+  ApplicationProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new ApplicationProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _ApplicationProxyCalls(impl);
+  }
+
+  ApplicationProxy.fromHandle(core.MojoHandle handle) :
+      impl = new ApplicationProxyImpl.fromHandle(handle) {
+    ptr = new _ApplicationProxyCalls(impl);
+  }
+
+  ApplicationProxy.unbound() :
+      impl = new ApplicationProxyImpl.unbound() {
+    ptr = new _ApplicationProxyCalls(impl);
+  }
+
+  factory ApplicationProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    ApplicationProxy p = new ApplicationProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static ApplicationProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ApplicationProxy"));
+    return new ApplicationProxy.fromEndpoint(endpoint);
+  }
+
+  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 "ApplicationProxy($impl)";
+  }
+}
+
+
+class ApplicationStub extends bindings.Stub {
+  Application _impl = null;
+
+  ApplicationStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  ApplicationStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  ApplicationStub.unbound() : super.unbound();
+
+  static ApplicationStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ApplicationStub"));
+    return new ApplicationStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = ApplicationName;
+
+
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      case kApplication_initialize_name:
+        var params = ApplicationInitializeParams.deserialize(
+            message.payload);
+        _impl.initialize(params.shell, params.args, params.url);
+        break;
+      case kApplication_acceptConnection_name:
+        var params = ApplicationAcceptConnectionParams.deserialize(
+            message.payload);
+        _impl.acceptConnection(params.requestorUrl, params.services, params.exposedServices, params.resolvedUrl);
+        break;
+      case kApplication_requestQuit_name:
+        var params = ApplicationRequestQuitParams.deserialize(
+            message.payload);
+        _impl.requestQuit();
+        break;
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  Application get impl => _impl;
+  set impl(Application d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "ApplicationStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+
diff --git a/mojo/dart/packages/mojo/lib/mojo/application_connector.mojom.dart b/mojo/dart/packages/mojo/lib/mojo/application_connector.mojom.dart
new file mode 100644
index 0000000..6f88cd6
--- /dev/null
+++ b/mojo/dart/packages/mojo/lib/mojo/application_connector.mojom.dart
@@ -0,0 +1,356 @@
+// 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.
+
+library application_connector_mojom;
+
+import 'dart:async';
+
+import 'package:mojo/bindings.dart' as bindings;
+import 'package:mojo/core.dart' as core;
+import 'package:mojo/mojo/service_provider.mojom.dart' as service_provider_mojom;
+
+
+
+class ApplicationConnectorConnectToApplicationParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(32, 0)
+  ];
+  String applicationUrl = null;
+  Object services = null;
+  Object exposedServices = null;
+
+  ApplicationConnectorConnectToApplicationParams() : super(kVersions.last.size);
+
+  static ApplicationConnectorConnectToApplicationParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ApplicationConnectorConnectToApplicationParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ApplicationConnectorConnectToApplicationParams result = new ApplicationConnectorConnectToApplicationParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.applicationUrl = decoder0.decodeString(8, false);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.services = decoder0.decodeInterfaceRequest(16, true, service_provider_mojom.ServiceProviderStub.newFromEndpoint);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.exposedServices = decoder0.decodeServiceInterface(20, true, service_provider_mojom.ServiceProviderProxy.newFromEndpoint);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeString(applicationUrl, 8, false);
+    
+    encoder0.encodeInterfaceRequest(services, 16, true);
+    
+    encoder0.encodeInterface(exposedServices, 20, true);
+  }
+
+  String toString() {
+    return "ApplicationConnectorConnectToApplicationParams("
+           "applicationUrl: $applicationUrl" ", "
+           "services: $services" ", "
+           "exposedServices: $exposedServices" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+
+class ApplicationConnectorDuplicateParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  Object applicationConnectorRequest = null;
+
+  ApplicationConnectorDuplicateParams() : super(kVersions.last.size);
+
+  static ApplicationConnectorDuplicateParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ApplicationConnectorDuplicateParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ApplicationConnectorDuplicateParams result = new ApplicationConnectorDuplicateParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.applicationConnectorRequest = decoder0.decodeInterfaceRequest(8, false, ApplicationConnectorStub.newFromEndpoint);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeInterfaceRequest(applicationConnectorRequest, 8, false);
+  }
+
+  String toString() {
+    return "ApplicationConnectorDuplicateParams("
+           "applicationConnectorRequest: $applicationConnectorRequest" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+const int kApplicationConnector_connectToApplication_name = 0;
+const int kApplicationConnector_duplicate_name = 1;
+
+const String ApplicationConnectorName =
+      'mojo::ApplicationConnector';
+
+abstract class ApplicationConnector {
+  void connectToApplication(String applicationUrl, Object services, Object exposedServices);
+  void duplicate(Object applicationConnectorRequest);
+
+}
+
+
+class ApplicationConnectorProxyImpl extends bindings.Proxy {
+  ApplicationConnectorProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  ApplicationConnectorProxyImpl.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);
+  }
+
+  String get name => ApplicationConnectorName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "ApplicationConnectorProxyImpl($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, kApplicationConnector_connectToApplication_name);
+    }
+  
+    void duplicate(Object applicationConnectorRequest) {
+      if (!_proxyImpl.isBound) {
+        _proxyImpl.proxyError("The Proxy is closed.");
+        return;
+      }
+      var params = new ApplicationConnectorDuplicateParams();
+      params.applicationConnectorRequest = applicationConnectorRequest;
+      _proxyImpl.sendMessage(params, kApplicationConnector_duplicate_name);
+    }
+  
+}
+
+
+class ApplicationConnectorProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  ApplicationConnector ptr;
+  final String name = ApplicationConnectorName;
+
+  ApplicationConnectorProxy(ApplicationConnectorProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _ApplicationConnectorProxyCalls(proxyImpl);
+
+  ApplicationConnectorProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new ApplicationConnectorProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _ApplicationConnectorProxyCalls(impl);
+  }
+
+  ApplicationConnectorProxy.fromHandle(core.MojoHandle handle) :
+      impl = new ApplicationConnectorProxyImpl.fromHandle(handle) {
+    ptr = new _ApplicationConnectorProxyCalls(impl);
+  }
+
+  ApplicationConnectorProxy.unbound() :
+      impl = new ApplicationConnectorProxyImpl.unbound() {
+    ptr = new _ApplicationConnectorProxyCalls(impl);
+  }
+
+  factory ApplicationConnectorProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    ApplicationConnectorProxy p = new ApplicationConnectorProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static ApplicationConnectorProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ApplicationConnectorProxy"));
+    return new ApplicationConnectorProxy.fromEndpoint(endpoint);
+  }
+
+  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)";
+  }
+}
+
+
+class ApplicationConnectorStub extends bindings.Stub {
+  ApplicationConnector _impl = null;
+
+  ApplicationConnectorStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  ApplicationConnectorStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  ApplicationConnectorStub.unbound() : super.unbound();
+
+  static ApplicationConnectorStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ApplicationConnectorStub"));
+    return new ApplicationConnectorStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = ApplicationConnectorName;
+
+
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      case kApplicationConnector_connectToApplication_name:
+        var params = ApplicationConnectorConnectToApplicationParams.deserialize(
+            message.payload);
+        _impl.connectToApplication(params.applicationUrl, params.services, params.exposedServices);
+        break;
+      case kApplicationConnector_duplicate_name:
+        var params = ApplicationConnectorDuplicateParams.deserialize(
+            message.payload);
+        _impl.duplicate(params.applicationConnectorRequest);
+        break;
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  ApplicationConnector get impl => _impl;
+  set impl(ApplicationConnector d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "ApplicationConnectorStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+
diff --git a/mojo/dart/packages/mojo/lib/mojo/http_header.mojom.dart b/mojo/dart/packages/mojo/lib/mojo/http_header.mojom.dart
new file mode 100644
index 0000000..87ca9eb
--- /dev/null
+++ b/mojo/dart/packages/mojo/lib/mojo/http_header.mojom.dart
@@ -0,0 +1,89 @@
+// 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.
+
+library http_header_mojom;
+
+import 'dart:async';
+
+import 'package:mojo/bindings.dart' as bindings;
+import 'package:mojo/core.dart' as core;
+
+
+
+class HttpHeader extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  String name = null;
+  String value = null;
+
+  HttpHeader() : super(kVersions.last.size);
+
+  static HttpHeader deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static HttpHeader decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    HttpHeader result = new HttpHeader();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.name = decoder0.decodeString(8, false);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.value = decoder0.decodeString(16, false);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeString(name, 8, false);
+    
+    encoder0.encodeString(value, 16, false);
+  }
+
+  String toString() {
+    return "HttpHeader("
+           "name: $name" ", "
+           "value: $value" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["name"] = name;
+    map["value"] = value;
+    return map;
+  }
+}
+
+
diff --git a/mojo/dart/packages/mojo/lib/mojo/interface_control_messages.mojom.dart b/mojo/dart/packages/mojo/lib/mojo/interface_control_messages.mojom.dart
new file mode 100644
index 0000000..df8e69a
--- /dev/null
+++ b/mojo/dart/packages/mojo/lib/mojo/interface_control_messages.mojom.dart
@@ -0,0 +1,465 @@
+// 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.
+
+library interface_control_messages_mojom;
+
+import 'dart:async';
+
+import 'package:mojo/bindings.dart' as bindings;
+import 'package:mojo/core.dart' as core;
+const kRunMessageId = 0xFFFFFFFF;
+const kRunOrClosePipeMessageId = 0xFFFFFFFE;
+
+
+
+class RunMessageParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  int reserved0 = 0;
+  int reserved1 = 0;
+  QueryVersion queryVersion = null;
+
+  RunMessageParams() : super(kVersions.last.size);
+
+  static RunMessageParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static RunMessageParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    RunMessageParams result = new RunMessageParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.reserved0 = decoder0.decodeUint32(8);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.reserved1 = decoder0.decodeUint32(12);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(16, false);
+      result.queryVersion = QueryVersion.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeUint32(reserved0, 8);
+    
+    encoder0.encodeUint32(reserved1, 12);
+    
+    encoder0.encodeStruct(queryVersion, 16, false);
+  }
+
+  String toString() {
+    return "RunMessageParams("
+           "reserved0: $reserved0" ", "
+           "reserved1: $reserved1" ", "
+           "queryVersion: $queryVersion" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["reserved0"] = reserved0;
+    map["reserved1"] = reserved1;
+    map["queryVersion"] = queryVersion;
+    return map;
+  }
+}
+
+
+class RunResponseMessageParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  int reserved0 = 0;
+  int reserved1 = 0;
+  QueryVersionResult queryVersionResult = null;
+
+  RunResponseMessageParams() : super(kVersions.last.size);
+
+  static RunResponseMessageParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static RunResponseMessageParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    RunResponseMessageParams result = new RunResponseMessageParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.reserved0 = decoder0.decodeUint32(8);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.reserved1 = decoder0.decodeUint32(12);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(16, false);
+      result.queryVersionResult = QueryVersionResult.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeUint32(reserved0, 8);
+    
+    encoder0.encodeUint32(reserved1, 12);
+    
+    encoder0.encodeStruct(queryVersionResult, 16, false);
+  }
+
+  String toString() {
+    return "RunResponseMessageParams("
+           "reserved0: $reserved0" ", "
+           "reserved1: $reserved1" ", "
+           "queryVersionResult: $queryVersionResult" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["reserved0"] = reserved0;
+    map["reserved1"] = reserved1;
+    map["queryVersionResult"] = queryVersionResult;
+    return map;
+  }
+}
+
+
+class QueryVersion extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(8, 0)
+  ];
+
+  QueryVersion() : super(kVersions.last.size);
+
+  static QueryVersion deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static QueryVersion decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    QueryVersion result = new QueryVersion();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    encoder.getStructEncoderAtOffset(kVersions.last);
+  }
+
+  String toString() {
+    return "QueryVersion("")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    return map;
+  }
+}
+
+
+class QueryVersionResult extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  int version = 0;
+
+  QueryVersionResult() : super(kVersions.last.size);
+
+  static QueryVersionResult deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static QueryVersionResult decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    QueryVersionResult result = new QueryVersionResult();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.version = decoder0.decodeUint32(8);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeUint32(version, 8);
+  }
+
+  String toString() {
+    return "QueryVersionResult("
+           "version: $version" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["version"] = version;
+    return map;
+  }
+}
+
+
+class RunOrClosePipeMessageParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  int reserved0 = 0;
+  int reserved1 = 0;
+  RequireVersion requireVersion = null;
+
+  RunOrClosePipeMessageParams() : super(kVersions.last.size);
+
+  static RunOrClosePipeMessageParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static RunOrClosePipeMessageParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    RunOrClosePipeMessageParams result = new RunOrClosePipeMessageParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.reserved0 = decoder0.decodeUint32(8);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.reserved1 = decoder0.decodeUint32(12);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(16, false);
+      result.requireVersion = RequireVersion.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeUint32(reserved0, 8);
+    
+    encoder0.encodeUint32(reserved1, 12);
+    
+    encoder0.encodeStruct(requireVersion, 16, false);
+  }
+
+  String toString() {
+    return "RunOrClosePipeMessageParams("
+           "reserved0: $reserved0" ", "
+           "reserved1: $reserved1" ", "
+           "requireVersion: $requireVersion" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["reserved0"] = reserved0;
+    map["reserved1"] = reserved1;
+    map["requireVersion"] = requireVersion;
+    return map;
+  }
+}
+
+
+class RequireVersion extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  int version = 0;
+
+  RequireVersion() : super(kVersions.last.size);
+
+  static RequireVersion deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static RequireVersion decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    RequireVersion result = new RequireVersion();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.version = decoder0.decodeUint32(8);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeUint32(version, 8);
+  }
+
+  String toString() {
+    return "RequireVersion("
+           "version: $version" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["version"] = version;
+    return map;
+  }
+}
+
+
diff --git a/mojo/dart/packages/mojo/lib/mojo/network_error.mojom.dart b/mojo/dart/packages/mojo/lib/mojo/network_error.mojom.dart
new file mode 100644
index 0000000..f9aca2f
--- /dev/null
+++ b/mojo/dart/packages/mojo/lib/mojo/network_error.mojom.dart
@@ -0,0 +1,89 @@
+// 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.
+
+library network_error_mojom;
+
+import 'dart:async';
+
+import 'package:mojo/bindings.dart' as bindings;
+import 'package:mojo/core.dart' as core;
+
+
+
+class NetworkError extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  int code = 0;
+  String description = null;
+
+  NetworkError() : super(kVersions.last.size);
+
+  static NetworkError deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static NetworkError decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    NetworkError result = new NetworkError();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.code = decoder0.decodeInt32(8);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.description = decoder0.decodeString(16, true);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeInt32(code, 8);
+    
+    encoder0.encodeString(description, 16, true);
+  }
+
+  String toString() {
+    return "NetworkError("
+           "code: $code" ", "
+           "description: $description" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["code"] = code;
+    map["description"] = description;
+    return map;
+  }
+}
+
+
diff --git a/mojo/dart/packages/mojo/lib/mojo/service_provider.mojom.dart b/mojo/dart/packages/mojo/lib/mojo/service_provider.mojom.dart
new file mode 100644
index 0000000..162cb27
--- /dev/null
+++ b/mojo/dart/packages/mojo/lib/mojo/service_provider.mojom.dart
@@ -0,0 +1,263 @@
+// 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.
+
+library service_provider_mojom;
+
+import 'dart:async';
+
+import 'package:mojo/bindings.dart' as bindings;
+import 'package:mojo/core.dart' as core;
+
+
+
+class ServiceProviderConnectToServiceParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  String interfaceName = null;
+  core.MojoMessagePipeEndpoint pipe = null;
+
+  ServiceProviderConnectToServiceParams() : super(kVersions.last.size);
+
+  static ServiceProviderConnectToServiceParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ServiceProviderConnectToServiceParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ServiceProviderConnectToServiceParams result = new ServiceProviderConnectToServiceParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.interfaceName = decoder0.decodeString(8, false);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.pipe = decoder0.decodeMessagePipeHandle(16, false);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeString(interfaceName, 8, false);
+    
+    encoder0.encodeMessagePipeHandle(pipe, 16, false);
+  }
+
+  String toString() {
+    return "ServiceProviderConnectToServiceParams("
+           "interfaceName: $interfaceName" ", "
+           "pipe: $pipe" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+const int kServiceProvider_connectToService_name = 0;
+
+const String ServiceProviderName =
+      'mojo::ServiceProvider';
+
+abstract class ServiceProvider {
+  void connectToService(String interfaceName, core.MojoMessagePipeEndpoint pipe);
+
+}
+
+
+class ServiceProviderProxyImpl extends bindings.Proxy {
+  ServiceProviderProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  ServiceProviderProxyImpl.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);
+  }
+
+  String get name => ServiceProviderName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "ServiceProviderProxyImpl($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, kServiceProvider_connectToService_name);
+    }
+  
+}
+
+
+class ServiceProviderProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  ServiceProvider ptr;
+  final String name = ServiceProviderName;
+
+  ServiceProviderProxy(ServiceProviderProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _ServiceProviderProxyCalls(proxyImpl);
+
+  ServiceProviderProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new ServiceProviderProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _ServiceProviderProxyCalls(impl);
+  }
+
+  ServiceProviderProxy.fromHandle(core.MojoHandle handle) :
+      impl = new ServiceProviderProxyImpl.fromHandle(handle) {
+    ptr = new _ServiceProviderProxyCalls(impl);
+  }
+
+  ServiceProviderProxy.unbound() :
+      impl = new ServiceProviderProxyImpl.unbound() {
+    ptr = new _ServiceProviderProxyCalls(impl);
+  }
+
+  factory ServiceProviderProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    ServiceProviderProxy p = new ServiceProviderProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static ServiceProviderProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ServiceProviderProxy"));
+    return new ServiceProviderProxy.fromEndpoint(endpoint);
+  }
+
+  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)";
+  }
+}
+
+
+class ServiceProviderStub extends bindings.Stub {
+  ServiceProvider _impl = null;
+
+  ServiceProviderStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  ServiceProviderStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  ServiceProviderStub.unbound() : super.unbound();
+
+  static ServiceProviderStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ServiceProviderStub"));
+    return new ServiceProviderStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = ServiceProviderName;
+
+
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      case kServiceProvider_connectToService_name:
+        var params = ServiceProviderConnectToServiceParams.deserialize(
+            message.payload);
+        _impl.connectToService(params.interfaceName, params.pipe);
+        break;
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  ServiceProvider get impl => _impl;
+  set impl(ServiceProvider d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "ServiceProviderStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+
diff --git a/mojo/dart/packages/mojo/lib/mojo/shell.mojom.dart b/mojo/dart/packages/mojo/lib/mojo/shell.mojom.dart
new file mode 100644
index 0000000..8fb8135
--- /dev/null
+++ b/mojo/dart/packages/mojo/lib/mojo/shell.mojom.dart
@@ -0,0 +1,357 @@
+// 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.
+
+library shell_mojom;
+
+import 'dart:async';
+
+import 'package:mojo/bindings.dart' as bindings;
+import 'package:mojo/core.dart' as core;
+import 'package:mojo/mojo/application_connector.mojom.dart' as application_connector_mojom;
+import 'package:mojo/mojo/service_provider.mojom.dart' as service_provider_mojom;
+
+
+
+class ShellConnectToApplicationParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(32, 0)
+  ];
+  String applicationUrl = null;
+  Object services = null;
+  Object exposedServices = null;
+
+  ShellConnectToApplicationParams() : super(kVersions.last.size);
+
+  static ShellConnectToApplicationParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ShellConnectToApplicationParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ShellConnectToApplicationParams result = new ShellConnectToApplicationParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.applicationUrl = decoder0.decodeString(8, false);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.services = decoder0.decodeInterfaceRequest(16, true, service_provider_mojom.ServiceProviderStub.newFromEndpoint);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.exposedServices = decoder0.decodeServiceInterface(20, true, service_provider_mojom.ServiceProviderProxy.newFromEndpoint);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeString(applicationUrl, 8, false);
+    
+    encoder0.encodeInterfaceRequest(services, 16, true);
+    
+    encoder0.encodeInterface(exposedServices, 20, true);
+  }
+
+  String toString() {
+    return "ShellConnectToApplicationParams("
+           "applicationUrl: $applicationUrl" ", "
+           "services: $services" ", "
+           "exposedServices: $exposedServices" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+
+class ShellCreateApplicationConnectorParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  Object applicationConnectorRequest = null;
+
+  ShellCreateApplicationConnectorParams() : super(kVersions.last.size);
+
+  static ShellCreateApplicationConnectorParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ShellCreateApplicationConnectorParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ShellCreateApplicationConnectorParams result = new ShellCreateApplicationConnectorParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.applicationConnectorRequest = decoder0.decodeInterfaceRequest(8, false, application_connector_mojom.ApplicationConnectorStub.newFromEndpoint);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeInterfaceRequest(applicationConnectorRequest, 8, false);
+  }
+
+  String toString() {
+    return "ShellCreateApplicationConnectorParams("
+           "applicationConnectorRequest: $applicationConnectorRequest" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+const int kShell_connectToApplication_name = 0;
+const int kShell_createApplicationConnector_name = 1;
+
+const String ShellName =
+      'mojo::Shell';
+
+abstract class Shell {
+  void connectToApplication(String applicationUrl, Object services, Object exposedServices);
+  void createApplicationConnector(Object applicationConnectorRequest);
+
+}
+
+
+class ShellProxyImpl extends bindings.Proxy {
+  ShellProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  ShellProxyImpl.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);
+  }
+
+  String get name => ShellName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "ShellProxyImpl($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, kShell_connectToApplication_name);
+    }
+  
+    void createApplicationConnector(Object applicationConnectorRequest) {
+      if (!_proxyImpl.isBound) {
+        _proxyImpl.proxyError("The Proxy is closed.");
+        return;
+      }
+      var params = new ShellCreateApplicationConnectorParams();
+      params.applicationConnectorRequest = applicationConnectorRequest;
+      _proxyImpl.sendMessage(params, kShell_createApplicationConnector_name);
+    }
+  
+}
+
+
+class ShellProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  Shell ptr;
+  final String name = ShellName;
+
+  ShellProxy(ShellProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _ShellProxyCalls(proxyImpl);
+
+  ShellProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new ShellProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _ShellProxyCalls(impl);
+  }
+
+  ShellProxy.fromHandle(core.MojoHandle handle) :
+      impl = new ShellProxyImpl.fromHandle(handle) {
+    ptr = new _ShellProxyCalls(impl);
+  }
+
+  ShellProxy.unbound() :
+      impl = new ShellProxyImpl.unbound() {
+    ptr = new _ShellProxyCalls(impl);
+  }
+
+  factory ShellProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    ShellProxy p = new ShellProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static ShellProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ShellProxy"));
+    return new ShellProxy.fromEndpoint(endpoint);
+  }
+
+  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)";
+  }
+}
+
+
+class ShellStub extends bindings.Stub {
+  Shell _impl = null;
+
+  ShellStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  ShellStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  ShellStub.unbound() : super.unbound();
+
+  static ShellStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ShellStub"));
+    return new ShellStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = ShellName;
+
+
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      case kShell_connectToApplication_name:
+        var params = ShellConnectToApplicationParams.deserialize(
+            message.payload);
+        _impl.connectToApplication(params.applicationUrl, params.services, params.exposedServices);
+        break;
+      case kShell_createApplicationConnector_name:
+        var params = ShellCreateApplicationConnectorParams.deserialize(
+            message.payload);
+        _impl.createApplicationConnector(params.applicationConnectorRequest);
+        break;
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  Shell get impl => _impl;
+  set impl(Shell d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "ShellStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+
diff --git a/mojo/dart/packages/mojo/lib/mojo/url_request.mojom.dart b/mojo/dart/packages/mojo/lib/mojo/url_request.mojom.dart
new file mode 100644
index 0000000..bb6e199
--- /dev/null
+++ b/mojo/dart/packages/mojo/lib/mojo/url_request.mojom.dart
@@ -0,0 +1,207 @@
+// 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.
+
+library url_request_mojom;
+
+import 'dart:async';
+
+import 'package:mojo/bindings.dart' as bindings;
+import 'package:mojo/core.dart' as core;
+import 'package:mojo/mojo/http_header.mojom.dart' as http_header_mojom;
+
+
+class UrlRequestCacheMode extends bindings.MojoEnum {
+  static const DEFAULT = const UrlRequestCacheMode._(0);
+  static const BYPASS_CACHE = const UrlRequestCacheMode._(1);
+  static const ONLY_FROM_CACHE = const UrlRequestCacheMode._(2);
+
+  const UrlRequestCacheMode._(int v) : super(v);
+
+  static const Map<String, UrlRequestCacheMode> valuesMap = const {
+    "DEFAULT": DEFAULT,
+    "BYPASS_CACHE": BYPASS_CACHE,
+    "ONLY_FROM_CACHE": ONLY_FROM_CACHE,
+  };
+  static const List<UrlRequestCacheMode> values = const [
+    DEFAULT,
+    BYPASS_CACHE,
+    ONLY_FROM_CACHE,
+  ];
+
+  static UrlRequestCacheMode valueOf(String name) => valuesMap[name];
+
+  factory UrlRequestCacheMode(int v) {
+    switch (v) {
+      case 0:
+        return DEFAULT;
+      case 1:
+        return BYPASS_CACHE;
+      case 2:
+        return ONLY_FROM_CACHE;
+      default:
+        return null;
+    }
+  }
+
+  static UrlRequestCacheMode decode(bindings.Decoder decoder0, int offset) {
+    int v = decoder0.decodeUint32(offset);
+    UrlRequestCacheMode result = new UrlRequestCacheMode(v);
+    if (result == null) {
+      throw new bindings.MojoCodecError(
+          'Bad value $v for enum UrlRequestCacheMode.');
+    }
+    return result;
+  }
+
+  String toString() {
+    switch(this) {
+      case DEFAULT:
+        return 'UrlRequestCacheMode.DEFAULT';
+      case BYPASS_CACHE:
+        return 'UrlRequestCacheMode.BYPASS_CACHE';
+      case ONLY_FROM_CACHE:
+        return 'UrlRequestCacheMode.ONLY_FROM_CACHE';
+    }
+  }
+
+  int toJson() => value;
+}
+
+class UrlRequest extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(56, 0)
+  ];
+  String url = null;
+  String method = "GET";
+  List<http_header_mojom.HttpHeader> headers = null;
+  List<core.MojoDataPipeConsumer> body = null;
+  int responseBodyBufferSize = 0;
+  bool autoFollowRedirects = false;
+  UrlRequestCacheMode cacheMode = new UrlRequestCacheMode(0);
+
+  UrlRequest() : super(kVersions.last.size);
+
+  static UrlRequest deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static UrlRequest decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    UrlRequest result = new UrlRequest();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.url = decoder0.decodeString(8, false);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.method = decoder0.decodeString(16, false);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(24, true);
+      if (decoder1 == null) {
+        result.headers = null;
+      } else {
+        var si1 = decoder1.decodeDataHeaderForPointerArray(bindings.kUnspecifiedArrayLength);
+        result.headers = new List<http_header_mojom.HttpHeader>(si1.numElements);
+        for (int i1 = 0; i1 < si1.numElements; ++i1) {
+          
+          var decoder2 = decoder1.decodePointer(bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i1, false);
+          result.headers[i1] = http_header_mojom.HttpHeader.decode(decoder2);
+        }
+      }
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.body = decoder0.decodeConsumerHandleArray(32, bindings.kArrayNullable, bindings.kUnspecifiedArrayLength);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.responseBodyBufferSize = decoder0.decodeUint32(40);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.autoFollowRedirects = decoder0.decodeBool(44, 0);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+        result.cacheMode = UrlRequestCacheMode.decode(decoder0, 48);
+        if (result.cacheMode == null) {
+          throw new bindings.MojoCodecError(
+            'Trying to decode null union for non-nullable UrlRequestCacheMode.');
+        }
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeString(url, 8, false);
+    
+    encoder0.encodeString(method, 16, false);
+    
+    if (headers == null) {
+      encoder0.encodeNullPointer(24, true);
+    } else {
+      var encoder1 = encoder0.encodePointerArray(headers.length, 24, bindings.kUnspecifiedArrayLength);
+      for (int i0 = 0; i0 < headers.length; ++i0) {
+        
+        encoder1.encodeStruct(headers[i0], bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i0, false);
+      }
+    }
+    
+    encoder0.encodeConsumerHandleArray(body, 32, bindings.kArrayNullable, bindings.kUnspecifiedArrayLength);
+    
+    encoder0.encodeUint32(responseBodyBufferSize, 40);
+    
+    encoder0.encodeBool(autoFollowRedirects, 44, 0);
+    
+    encoder0.encodeEnum(cacheMode, 48);
+  }
+
+  String toString() {
+    return "UrlRequest("
+           "url: $url" ", "
+           "method: $method" ", "
+           "headers: $headers" ", "
+           "body: $body" ", "
+           "responseBodyBufferSize: $responseBodyBufferSize" ", "
+           "autoFollowRedirects: $autoFollowRedirects" ", "
+           "cacheMode: $cacheMode" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+
diff --git a/mojo/dart/packages/mojo/lib/mojo/url_response.mojom.dart b/mojo/dart/packages/mojo/lib/mojo/url_response.mojom.dart
new file mode 100644
index 0000000..8369203
--- /dev/null
+++ b/mojo/dart/packages/mojo/lib/mojo/url_response.mojom.dart
@@ -0,0 +1,181 @@
+// 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.
+
+library url_response_mojom;
+
+import 'dart:async';
+
+import 'package:mojo/bindings.dart' as bindings;
+import 'package:mojo/core.dart' as core;
+import 'package:mojo/mojo/http_header.mojom.dart' as http_header_mojom;
+import 'package:mojo/mojo/network_error.mojom.dart' as network_error_mojom;
+
+
+
+class UrlResponse extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(88, 0)
+  ];
+  network_error_mojom.NetworkError error = null;
+  core.MojoDataPipeConsumer body = null;
+  int statusCode = 0;
+  String url = null;
+  String statusLine = null;
+  List<http_header_mojom.HttpHeader> headers = null;
+  String mimeType = null;
+  String charset = null;
+  String redirectMethod = null;
+  String redirectUrl = null;
+  String redirectReferrer = null;
+
+  UrlResponse() : super(kVersions.last.size);
+
+  static UrlResponse deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static UrlResponse decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    UrlResponse result = new UrlResponse();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, true);
+      result.error = network_error_mojom.NetworkError.decode(decoder1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.body = decoder0.decodeConsumerHandle(16, true);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.statusCode = decoder0.decodeUint32(20);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.url = decoder0.decodeString(24, true);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.statusLine = decoder0.decodeString(32, true);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(40, true);
+      if (decoder1 == null) {
+        result.headers = null;
+      } else {
+        var si1 = decoder1.decodeDataHeaderForPointerArray(bindings.kUnspecifiedArrayLength);
+        result.headers = new List<http_header_mojom.HttpHeader>(si1.numElements);
+        for (int i1 = 0; i1 < si1.numElements; ++i1) {
+          
+          var decoder2 = decoder1.decodePointer(bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i1, false);
+          result.headers[i1] = http_header_mojom.HttpHeader.decode(decoder2);
+        }
+      }
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.mimeType = decoder0.decodeString(48, true);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.charset = decoder0.decodeString(56, true);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.redirectMethod = decoder0.decodeString(64, true);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.redirectUrl = decoder0.decodeString(72, true);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.redirectReferrer = decoder0.decodeString(80, true);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(error, 8, true);
+    
+    encoder0.encodeConsumerHandle(body, 16, true);
+    
+    encoder0.encodeUint32(statusCode, 20);
+    
+    encoder0.encodeString(url, 24, true);
+    
+    encoder0.encodeString(statusLine, 32, true);
+    
+    if (headers == null) {
+      encoder0.encodeNullPointer(40, true);
+    } else {
+      var encoder1 = encoder0.encodePointerArray(headers.length, 40, bindings.kUnspecifiedArrayLength);
+      for (int i0 = 0; i0 < headers.length; ++i0) {
+        
+        encoder1.encodeStruct(headers[i0], bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i0, false);
+      }
+    }
+    
+    encoder0.encodeString(mimeType, 48, true);
+    
+    encoder0.encodeString(charset, 56, true);
+    
+    encoder0.encodeString(redirectMethod, 64, true);
+    
+    encoder0.encodeString(redirectUrl, 72, true);
+    
+    encoder0.encodeString(redirectReferrer, 80, true);
+  }
+
+  String toString() {
+    return "UrlResponse("
+           "error: $error" ", "
+           "body: $body" ", "
+           "statusCode: $statusCode" ", "
+           "url: $url" ", "
+           "statusLine: $statusLine" ", "
+           "headers: $headers" ", "
+           "mimeType: $mimeType" ", "
+           "charset: $charset" ", "
+           "redirectMethod: $redirectMethod" ", "
+           "redirectUrl: $redirectUrl" ", "
+           "redirectReferrer: $redirectReferrer" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+
diff --git a/mojo/dart/packages/mojo/sources.gni b/mojo/dart/packages/mojo/sources.gni
index 057a93b..3e43e3a 100644
--- a/mojo/dart/packages/mojo/sources.gni
+++ b/mojo/dart/packages/mojo/sources.gni
@@ -10,6 +10,18 @@
   "lib/core.dart",
 ]
 
+package_mojo_bindings = [
+  "lib/mojo/application_connector.mojom.dart",
+  "lib/mojo/interface_control_messages.mojom.dart",
+  "lib/mojo/shell.mojom.dart",
+  "lib/mojo/application.mojom.dart",
+  "lib/mojo/network_error.mojom.dart",
+  "lib/mojo/url_request.mojom.dart",
+  "lib/mojo/http_header.mojom.dart",
+  "lib/mojo/service_provider.mojom.dart",
+  "lib/mojo/url_response.mojom.dart",
+]
+
 package_mojo_sources = [
                          "lib/src/application_connection.dart",
                          "lib/src/application.dart",
@@ -30,4 +42,4 @@
                          "lib/src/types.dart",
                          "lib/src/union.dart",
                          "lib/src/utils.dart",
-                       ] + package_mojo_entrypoints
+                       ] + package_mojo_entrypoints + package_mojo_bindings
diff --git a/mojo/dart/packages/mojo_services/BUILD.gn b/mojo/dart/packages/mojo_services/BUILD.gn
index b0c67fe..2a3b602 100644
--- a/mojo/dart/packages/mojo_services/BUILD.gn
+++ b/mojo/dart/packages/mojo_services/BUILD.gn
@@ -5,12 +5,92 @@
 import("//mojo/public/dart/rules.gni")
 import("//mojo/services/mojo_services.gni")
 
+# TODO(johnmccutchan): Automate this.
+# for i in `find lib/|grep mojom.dart`;do echo \"$i\",;done
+bindings_sources = [
+  "lib/mojo/gpu.mojom.dart",
+  "lib/mojo/clipboard.mojom.dart",
+  "lib/mojo/view_manager_constants.mojom.dart",
+  "lib/mojo/quads.mojom.dart",
+  "lib/mojo/navigation.mojom.dart",
+  "lib/mojo/display.mojom.dart",
+  "lib/mojo/authenticating_url_loader_interceptor_meta_factory.mojom.dart",
+  "lib/mojo/window_manager_internal.mojom.dart",
+  "lib/mojo/url_loader.mojom.dart",
+  "lib/mojo/content_handler.mojom.dart",
+  "lib/mojo/window_manager.mojom.dart",
+  "lib/mojo/geocoder.mojom.dart",
+  "lib/mojo/host_resolver.mojom.dart",
+  "lib/mojo/command_buffer.mojom.dart",
+  "lib/mojo/http_server.mojom.dart",
+  "lib/mojo/files/file.mojom.dart",
+  "lib/mojo/files/ioctl_terminal.mojom.dart",
+  "lib/mojo/files/directory.mojom.dart",
+  "lib/mojo/files/files.mojom.dart",
+  "lib/mojo/files/types.mojom.dart",
+  "lib/mojo/files/ioctl.mojom.dart",
+  "lib/mojo/asset_bundle/asset_bundle.mojom.dart",
+  "lib/mojo/net_address.mojom.dart",
+  "lib/mojo/ui/view_provider.mojom.dart",
+  "lib/mojo/ui/views.mojom.dart",
+  "lib/mojo/ui/view_trees.mojom.dart",
+  "lib/mojo/ui/layouts.mojom.dart",
+  "lib/mojo/ui/view_manager.mojom.dart",
+  "lib/mojo/web_socket.mojom.dart",
+  "lib/mojo/url_loader_interceptor.mojom.dart",
+  "lib/mojo/viewport_parameter_listener.mojom.dart",
+  "lib/mojo/location.mojom.dart",
+  "lib/mojo/service_registry.mojom.dart",
+  "lib/mojo/network_service.mojom.dart",
+  "lib/mojo/http_message.mojom.dart",
+  "lib/mojo/cookie_store.mojom.dart",
+  "lib/mojo/input_events.mojom.dart",
+  "lib/mojo/udp_socket.mojom.dart",
+  "lib/mojo/http_connection.mojom.dart",
+  "lib/mojo/native_viewport.mojom.dart",
+  "lib/mojo/tcp_connected_socket.mojom.dart",
+  "lib/mojo/input_key_codes.mojom.dart",
+  "lib/mojo/sharing.mojom.dart",
+  "lib/mojo/gpu_capabilities.mojom.dart",
+  "lib/mojo/context_provider.mojom.dart",
+  "lib/mojo/animations.mojom.dart",
+  "lib/mojo/surface_id.mojom.dart",
+  "lib/mojo/tcp_server_socket.mojom.dart",
+  "lib/mojo/view_manager.mojom.dart",
+  "lib/mojo/url_response_disk_cache.mojom.dart",
+  "lib/mojo/terminal/terminal.mojom.dart",
+  "lib/mojo/terminal/terminal_client.mojom.dart",
+  "lib/mojo/geometry.mojom.dart",
+  "lib/mojo/tcp_bound_socket.mojom.dart",
+  "lib/mojo/input_event_constants.mojom.dart",
+  "lib/mojo/surfaces.mojom.dart",
+  "lib/mojo/device_info.mojom.dart",
+  "lib/mojo/camera.mojom.dart",
+  "lib/mojo/location_service.mojom.dart",
+  "lib/contacts/contacts.mojom.dart",
+  "lib/authentication/authentication.mojom.dart",
+  "lib/tracing/tracing.mojom.dart",
+  "lib/input/input.mojom.dart",
+  "lib/prediction/prediction.mojom.dart",
+  "lib/nfc/nfc.mojom.dart",
+  "lib/native_support/process.mojom.dart",
+  "lib/speech_recognizer/speech_recognizer.mojom.dart",
+  "lib/http_server/http_server.mojom.dart",
+  "lib/http_server/http_request.mojom.dart",
+  "lib/http_server/http_server_factory.mojom.dart",
+  "lib/http_server/http_response.mojom.dart",
+  "lib/keyboard/keyboard.mojom.dart",
+  "lib/notifications/notifications.mojom.dart",
+  "lib/icu_data/icu_data.mojom.dart",
+  "lib/sensors/sensors.mojom.dart",
+]
+
 dart_pkg("mojo_services") {
   sources = [
-    "CHANGELOG.md",
-    "README.md",
-    "pubspec.yaml",
-  ]
+              "CHANGELOG.md",
+              "README.md",
+              "pubspec.yaml",
+            ] + bindings_sources
 
   deps = [
     "//mojo/public/dart",
diff --git a/mojo/dart/packages/mojo_services/lib/authentication/authentication.mojom.dart b/mojo/dart/packages/mojo_services/lib/authentication/authentication.mojom.dart
new file mode 100644
index 0000000..c709bf2
--- /dev/null
+++ b/mojo/dart/packages/mojo_services/lib/authentication/authentication.mojom.dart
@@ -0,0 +1,685 @@
+// 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.
+
+library authentication_mojom;
+
+import 'dart:async';
+
+import 'package:mojo/bindings.dart' as bindings;
+import 'package:mojo/core.dart' as core;
+
+
+
+class AuthenticationServiceSelectAccountParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  bool returnLastSelected = false;
+
+  AuthenticationServiceSelectAccountParams() : super(kVersions.last.size);
+
+  static AuthenticationServiceSelectAccountParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static AuthenticationServiceSelectAccountParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    AuthenticationServiceSelectAccountParams result = new AuthenticationServiceSelectAccountParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.returnLastSelected = decoder0.decodeBool(8, 0);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeBool(returnLastSelected, 8, 0);
+  }
+
+  String toString() {
+    return "AuthenticationServiceSelectAccountParams("
+           "returnLastSelected: $returnLastSelected" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["returnLastSelected"] = returnLastSelected;
+    return map;
+  }
+}
+
+
+class AuthenticationServiceSelectAccountResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  String username = null;
+  String error = null;
+
+  AuthenticationServiceSelectAccountResponseParams() : super(kVersions.last.size);
+
+  static AuthenticationServiceSelectAccountResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static AuthenticationServiceSelectAccountResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    AuthenticationServiceSelectAccountResponseParams result = new AuthenticationServiceSelectAccountResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.username = decoder0.decodeString(8, true);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.error = decoder0.decodeString(16, true);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeString(username, 8, true);
+    
+    encoder0.encodeString(error, 16, true);
+  }
+
+  String toString() {
+    return "AuthenticationServiceSelectAccountResponseParams("
+           "username: $username" ", "
+           "error: $error" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["username"] = username;
+    map["error"] = error;
+    return map;
+  }
+}
+
+
+class AuthenticationServiceGetOAuth2TokenParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  String username = null;
+  List<String> scopes = null;
+
+  AuthenticationServiceGetOAuth2TokenParams() : super(kVersions.last.size);
+
+  static AuthenticationServiceGetOAuth2TokenParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static AuthenticationServiceGetOAuth2TokenParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    AuthenticationServiceGetOAuth2TokenParams result = new AuthenticationServiceGetOAuth2TokenParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.username = decoder0.decodeString(8, false);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(16, false);
+      {
+        var si1 = decoder1.decodeDataHeaderForPointerArray(bindings.kUnspecifiedArrayLength);
+        result.scopes = new List<String>(si1.numElements);
+        for (int i1 = 0; i1 < si1.numElements; ++i1) {
+          
+          result.scopes[i1] = decoder1.decodeString(bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i1, false);
+        }
+      }
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeString(username, 8, false);
+    
+    if (scopes == null) {
+      encoder0.encodeNullPointer(16, false);
+    } else {
+      var encoder1 = encoder0.encodePointerArray(scopes.length, 16, bindings.kUnspecifiedArrayLength);
+      for (int i0 = 0; i0 < scopes.length; ++i0) {
+        
+        encoder1.encodeString(scopes[i0], bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i0, false);
+      }
+    }
+  }
+
+  String toString() {
+    return "AuthenticationServiceGetOAuth2TokenParams("
+           "username: $username" ", "
+           "scopes: $scopes" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["username"] = username;
+    map["scopes"] = scopes;
+    return map;
+  }
+}
+
+
+class AuthenticationServiceGetOAuth2TokenResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  String token = null;
+  String error = null;
+
+  AuthenticationServiceGetOAuth2TokenResponseParams() : super(kVersions.last.size);
+
+  static AuthenticationServiceGetOAuth2TokenResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static AuthenticationServiceGetOAuth2TokenResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    AuthenticationServiceGetOAuth2TokenResponseParams result = new AuthenticationServiceGetOAuth2TokenResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.token = decoder0.decodeString(8, true);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.error = decoder0.decodeString(16, true);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeString(token, 8, true);
+    
+    encoder0.encodeString(error, 16, true);
+  }
+
+  String toString() {
+    return "AuthenticationServiceGetOAuth2TokenResponseParams("
+           "token: $token" ", "
+           "error: $error" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["token"] = token;
+    map["error"] = error;
+    return map;
+  }
+}
+
+
+class AuthenticationServiceClearOAuth2TokenParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  String token = null;
+
+  AuthenticationServiceClearOAuth2TokenParams() : super(kVersions.last.size);
+
+  static AuthenticationServiceClearOAuth2TokenParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static AuthenticationServiceClearOAuth2TokenParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    AuthenticationServiceClearOAuth2TokenParams result = new AuthenticationServiceClearOAuth2TokenParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.token = decoder0.decodeString(8, false);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeString(token, 8, false);
+  }
+
+  String toString() {
+    return "AuthenticationServiceClearOAuth2TokenParams("
+           "token: $token" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["token"] = token;
+    return map;
+  }
+}
+
+const int kAuthenticationService_selectAccount_name = 0;
+const int kAuthenticationService_getOAuth2Token_name = 1;
+const int kAuthenticationService_clearOAuth2Token_name = 2;
+
+const String AuthenticationServiceName =
+      'authentication::AuthenticationService';
+
+abstract class AuthenticationService {
+  dynamic selectAccount(bool returnLastSelected,[Function responseFactory = null]);
+  dynamic getOAuth2Token(String username,List<String> scopes,[Function responseFactory = null]);
+  void clearOAuth2Token(String token);
+
+}
+
+
+class AuthenticationServiceProxyImpl extends bindings.Proxy {
+  AuthenticationServiceProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  AuthenticationServiceProxyImpl.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);
+  }
+
+  String get name => AuthenticationServiceName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      case kAuthenticationService_selectAccount_name:
+        var r = AuthenticationServiceSelectAccountResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      case kAuthenticationService_getOAuth2Token_name:
+        var r = AuthenticationServiceGetOAuth2TokenResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "AuthenticationServiceProxyImpl($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,
+          kAuthenticationService_selectAccount_name,
+          -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,
+          kAuthenticationService_getOAuth2Token_name,
+          -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, kAuthenticationService_clearOAuth2Token_name);
+    }
+  
+}
+
+
+class AuthenticationServiceProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  AuthenticationService ptr;
+  final String name = AuthenticationServiceName;
+
+  AuthenticationServiceProxy(AuthenticationServiceProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _AuthenticationServiceProxyCalls(proxyImpl);
+
+  AuthenticationServiceProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new AuthenticationServiceProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _AuthenticationServiceProxyCalls(impl);
+  }
+
+  AuthenticationServiceProxy.fromHandle(core.MojoHandle handle) :
+      impl = new AuthenticationServiceProxyImpl.fromHandle(handle) {
+    ptr = new _AuthenticationServiceProxyCalls(impl);
+  }
+
+  AuthenticationServiceProxy.unbound() :
+      impl = new AuthenticationServiceProxyImpl.unbound() {
+    ptr = new _AuthenticationServiceProxyCalls(impl);
+  }
+
+  factory AuthenticationServiceProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    AuthenticationServiceProxy p = new AuthenticationServiceProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static AuthenticationServiceProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For AuthenticationServiceProxy"));
+    return new AuthenticationServiceProxy.fromEndpoint(endpoint);
+  }
+
+  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 "AuthenticationServiceProxy($impl)";
+  }
+}
+
+
+class AuthenticationServiceStub extends bindings.Stub {
+  AuthenticationService _impl = null;
+
+  AuthenticationServiceStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  AuthenticationServiceStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  AuthenticationServiceStub.unbound() : super.unbound();
+
+  static AuthenticationServiceStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For AuthenticationServiceStub"));
+    return new AuthenticationServiceStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = AuthenticationServiceName;
+
+
+  AuthenticationServiceSelectAccountResponseParams _AuthenticationServiceSelectAccountResponseParamsFactory(String username, String error) {
+    var result = new AuthenticationServiceSelectAccountResponseParams();
+    result.username = username;
+    result.error = error;
+    return result;
+  }
+  AuthenticationServiceGetOAuth2TokenResponseParams _AuthenticationServiceGetOAuth2TokenResponseParamsFactory(String token, String error) {
+    var result = new AuthenticationServiceGetOAuth2TokenResponseParams();
+    result.token = token;
+    result.error = error;
+    return result;
+  }
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      case kAuthenticationService_selectAccount_name:
+        var params = AuthenticationServiceSelectAccountParams.deserialize(
+            message.payload);
+        var response = _impl.selectAccount(params.returnLastSelected,_AuthenticationServiceSelectAccountResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kAuthenticationService_selectAccount_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kAuthenticationService_selectAccount_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      case kAuthenticationService_getOAuth2Token_name:
+        var params = AuthenticationServiceGetOAuth2TokenParams.deserialize(
+            message.payload);
+        var response = _impl.getOAuth2Token(params.username,params.scopes,_AuthenticationServiceGetOAuth2TokenResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kAuthenticationService_getOAuth2Token_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kAuthenticationService_getOAuth2Token_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      case kAuthenticationService_clearOAuth2Token_name:
+        var params = AuthenticationServiceClearOAuth2TokenParams.deserialize(
+            message.payload);
+        _impl.clearOAuth2Token(params.token);
+        break;
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  AuthenticationService get impl => _impl;
+  set impl(AuthenticationService d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "AuthenticationServiceStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+
diff --git a/mojo/dart/packages/mojo_services/lib/contacts/contacts.mojom.dart b/mojo/dart/packages/mojo_services/lib/contacts/contacts.mojom.dart
new file mode 100644
index 0000000..d8f44ee
--- /dev/null
+++ b/mojo/dart/packages/mojo_services/lib/contacts/contacts.mojom.dart
@@ -0,0 +1,1078 @@
+// 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.
+
+library contacts_mojom;
+
+import 'dart:async';
+
+import 'package:mojo/bindings.dart' as bindings;
+import 'package:mojo/core.dart' as core;
+
+
+
+class Contact extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  int id = 0;
+  String name = null;
+
+  Contact() : super(kVersions.last.size);
+
+  static Contact deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static Contact decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    Contact result = new Contact();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.id = decoder0.decodeInt64(8);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.name = decoder0.decodeString(16, false);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeInt64(id, 8);
+    
+    encoder0.encodeString(name, 16, false);
+  }
+
+  String toString() {
+    return "Contact("
+           "id: $id" ", "
+           "name: $name" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["id"] = id;
+    map["name"] = name;
+    return map;
+  }
+}
+
+
+class ContactsServiceGetCountParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  String filter = null;
+
+  ContactsServiceGetCountParams() : super(kVersions.last.size);
+
+  static ContactsServiceGetCountParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ContactsServiceGetCountParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ContactsServiceGetCountParams result = new ContactsServiceGetCountParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.filter = decoder0.decodeString(8, true);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeString(filter, 8, true);
+  }
+
+  String toString() {
+    return "ContactsServiceGetCountParams("
+           "filter: $filter" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["filter"] = filter;
+    return map;
+  }
+}
+
+
+class ContactsServiceGetCountResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  int count = 0;
+
+  ContactsServiceGetCountResponseParams() : super(kVersions.last.size);
+
+  static ContactsServiceGetCountResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ContactsServiceGetCountResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ContactsServiceGetCountResponseParams result = new ContactsServiceGetCountResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.count = decoder0.decodeUint64(8);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeUint64(count, 8);
+  }
+
+  String toString() {
+    return "ContactsServiceGetCountResponseParams("
+           "count: $count" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["count"] = count;
+    return map;
+  }
+}
+
+
+class ContactsServiceGetParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  String filter = null;
+  int offset = 0;
+  int limit = 0;
+
+  ContactsServiceGetParams() : super(kVersions.last.size);
+
+  static ContactsServiceGetParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ContactsServiceGetParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ContactsServiceGetParams result = new ContactsServiceGetParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.filter = decoder0.decodeString(8, true);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.offset = decoder0.decodeUint32(16);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.limit = decoder0.decodeUint32(20);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeString(filter, 8, true);
+    
+    encoder0.encodeUint32(offset, 16);
+    
+    encoder0.encodeUint32(limit, 20);
+  }
+
+  String toString() {
+    return "ContactsServiceGetParams("
+           "filter: $filter" ", "
+           "offset: $offset" ", "
+           "limit: $limit" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["filter"] = filter;
+    map["offset"] = offset;
+    map["limit"] = limit;
+    return map;
+  }
+}
+
+
+class ContactsServiceGetResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  List<Contact> contacts = null;
+
+  ContactsServiceGetResponseParams() : super(kVersions.last.size);
+
+  static ContactsServiceGetResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ContactsServiceGetResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ContactsServiceGetResponseParams result = new ContactsServiceGetResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, false);
+      {
+        var si1 = decoder1.decodeDataHeaderForPointerArray(bindings.kUnspecifiedArrayLength);
+        result.contacts = new List<Contact>(si1.numElements);
+        for (int i1 = 0; i1 < si1.numElements; ++i1) {
+          
+          var decoder2 = decoder1.decodePointer(bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i1, false);
+          result.contacts[i1] = Contact.decode(decoder2);
+        }
+      }
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    if (contacts == null) {
+      encoder0.encodeNullPointer(8, false);
+    } else {
+      var encoder1 = encoder0.encodePointerArray(contacts.length, 8, bindings.kUnspecifiedArrayLength);
+      for (int i0 = 0; i0 < contacts.length; ++i0) {
+        
+        encoder1.encodeStruct(contacts[i0], bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i0, false);
+      }
+    }
+  }
+
+  String toString() {
+    return "ContactsServiceGetResponseParams("
+           "contacts: $contacts" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["contacts"] = contacts;
+    return map;
+  }
+}
+
+
+class ContactsServiceGetEmailsParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  int id = 0;
+
+  ContactsServiceGetEmailsParams() : super(kVersions.last.size);
+
+  static ContactsServiceGetEmailsParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ContactsServiceGetEmailsParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ContactsServiceGetEmailsParams result = new ContactsServiceGetEmailsParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.id = decoder0.decodeInt64(8);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeInt64(id, 8);
+  }
+
+  String toString() {
+    return "ContactsServiceGetEmailsParams("
+           "id: $id" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["id"] = id;
+    return map;
+  }
+}
+
+
+class ContactsServiceGetEmailsResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  List<String> emails = null;
+
+  ContactsServiceGetEmailsResponseParams() : super(kVersions.last.size);
+
+  static ContactsServiceGetEmailsResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ContactsServiceGetEmailsResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ContactsServiceGetEmailsResponseParams result = new ContactsServiceGetEmailsResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, false);
+      {
+        var si1 = decoder1.decodeDataHeaderForPointerArray(bindings.kUnspecifiedArrayLength);
+        result.emails = new List<String>(si1.numElements);
+        for (int i1 = 0; i1 < si1.numElements; ++i1) {
+          
+          result.emails[i1] = decoder1.decodeString(bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i1, false);
+        }
+      }
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    if (emails == null) {
+      encoder0.encodeNullPointer(8, false);
+    } else {
+      var encoder1 = encoder0.encodePointerArray(emails.length, 8, bindings.kUnspecifiedArrayLength);
+      for (int i0 = 0; i0 < emails.length; ++i0) {
+        
+        encoder1.encodeString(emails[i0], bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i0, false);
+      }
+    }
+  }
+
+  String toString() {
+    return "ContactsServiceGetEmailsResponseParams("
+           "emails: $emails" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["emails"] = emails;
+    return map;
+  }
+}
+
+
+class ContactsServiceGetPhotoParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  int id = 0;
+  bool highResolution = false;
+
+  ContactsServiceGetPhotoParams() : super(kVersions.last.size);
+
+  static ContactsServiceGetPhotoParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ContactsServiceGetPhotoParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ContactsServiceGetPhotoParams result = new ContactsServiceGetPhotoParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.id = decoder0.decodeInt64(8);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.highResolution = decoder0.decodeBool(16, 0);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeInt64(id, 8);
+    
+    encoder0.encodeBool(highResolution, 16, 0);
+  }
+
+  String toString() {
+    return "ContactsServiceGetPhotoParams("
+           "id: $id" ", "
+           "highResolution: $highResolution" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["id"] = id;
+    map["highResolution"] = highResolution;
+    return map;
+  }
+}
+
+
+class ContactsServiceGetPhotoResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  String photoUrl = null;
+
+  ContactsServiceGetPhotoResponseParams() : super(kVersions.last.size);
+
+  static ContactsServiceGetPhotoResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ContactsServiceGetPhotoResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ContactsServiceGetPhotoResponseParams result = new ContactsServiceGetPhotoResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.photoUrl = decoder0.decodeString(8, true);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeString(photoUrl, 8, true);
+  }
+
+  String toString() {
+    return "ContactsServiceGetPhotoResponseParams("
+           "photoUrl: $photoUrl" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["photoUrl"] = photoUrl;
+    return map;
+  }
+}
+
+const int kContactsService_getCount_name = 0;
+const int kContactsService_get_name = 1;
+const int kContactsService_getEmails_name = 2;
+const int kContactsService_getPhoto_name = 3;
+
+const String ContactsServiceName =
+      'contacts::ContactsService';
+
+abstract class ContactsService {
+  dynamic getCount(String filter,[Function responseFactory = null]);
+  dynamic get(String filter,int offset,int limit,[Function responseFactory = null]);
+  dynamic getEmails(int id,[Function responseFactory = null]);
+  dynamic getPhoto(int id,bool highResolution,[Function responseFactory = null]);
+
+}
+
+
+class ContactsServiceProxyImpl extends bindings.Proxy {
+  ContactsServiceProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  ContactsServiceProxyImpl.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);
+  }
+
+  String get name => ContactsServiceName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      case kContactsService_getCount_name:
+        var r = ContactsServiceGetCountResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      case kContactsService_get_name:
+        var r = ContactsServiceGetResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      case kContactsService_getEmails_name:
+        var r = ContactsServiceGetEmailsResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      case kContactsService_getPhoto_name:
+        var r = ContactsServiceGetPhotoResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "ContactsServiceProxyImpl($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,
+          kContactsService_getCount_name,
+          -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,
+          kContactsService_get_name,
+          -1,
+          bindings.MessageHeader.kMessageExpectsResponse);
+    }
+    dynamic getEmails(int id,[Function responseFactory = null]) {
+      var params = new ContactsServiceGetEmailsParams();
+      params.id = id;
+      return _proxyImpl.sendMessageWithRequestId(
+          params,
+          kContactsService_getEmails_name,
+          -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,
+          kContactsService_getPhoto_name,
+          -1,
+          bindings.MessageHeader.kMessageExpectsResponse);
+    }
+}
+
+
+class ContactsServiceProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  ContactsService ptr;
+  final String name = ContactsServiceName;
+
+  ContactsServiceProxy(ContactsServiceProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _ContactsServiceProxyCalls(proxyImpl);
+
+  ContactsServiceProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new ContactsServiceProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _ContactsServiceProxyCalls(impl);
+  }
+
+  ContactsServiceProxy.fromHandle(core.MojoHandle handle) :
+      impl = new ContactsServiceProxyImpl.fromHandle(handle) {
+    ptr = new _ContactsServiceProxyCalls(impl);
+  }
+
+  ContactsServiceProxy.unbound() :
+      impl = new ContactsServiceProxyImpl.unbound() {
+    ptr = new _ContactsServiceProxyCalls(impl);
+  }
+
+  factory ContactsServiceProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    ContactsServiceProxy p = new ContactsServiceProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static ContactsServiceProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ContactsServiceProxy"));
+    return new ContactsServiceProxy.fromEndpoint(endpoint);
+  }
+
+  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 "ContactsServiceProxy($impl)";
+  }
+}
+
+
+class ContactsServiceStub extends bindings.Stub {
+  ContactsService _impl = null;
+
+  ContactsServiceStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  ContactsServiceStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  ContactsServiceStub.unbound() : super.unbound();
+
+  static ContactsServiceStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ContactsServiceStub"));
+    return new ContactsServiceStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = ContactsServiceName;
+
+
+  ContactsServiceGetCountResponseParams _ContactsServiceGetCountResponseParamsFactory(int count) {
+    var result = new ContactsServiceGetCountResponseParams();
+    result.count = count;
+    return result;
+  }
+  ContactsServiceGetResponseParams _ContactsServiceGetResponseParamsFactory(List<Contact> contacts) {
+    var result = new ContactsServiceGetResponseParams();
+    result.contacts = contacts;
+    return result;
+  }
+  ContactsServiceGetEmailsResponseParams _ContactsServiceGetEmailsResponseParamsFactory(List<String> emails) {
+    var result = new ContactsServiceGetEmailsResponseParams();
+    result.emails = emails;
+    return result;
+  }
+  ContactsServiceGetPhotoResponseParams _ContactsServiceGetPhotoResponseParamsFactory(String photoUrl) {
+    var result = new ContactsServiceGetPhotoResponseParams();
+    result.photoUrl = photoUrl;
+    return result;
+  }
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      case kContactsService_getCount_name:
+        var params = ContactsServiceGetCountParams.deserialize(
+            message.payload);
+        var response = _impl.getCount(params.filter,_ContactsServiceGetCountResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kContactsService_getCount_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kContactsService_getCount_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      case kContactsService_get_name:
+        var params = ContactsServiceGetParams.deserialize(
+            message.payload);
+        var response = _impl.get(params.filter,params.offset,params.limit,_ContactsServiceGetResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kContactsService_get_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kContactsService_get_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      case kContactsService_getEmails_name:
+        var params = ContactsServiceGetEmailsParams.deserialize(
+            message.payload);
+        var response = _impl.getEmails(params.id,_ContactsServiceGetEmailsResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kContactsService_getEmails_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kContactsService_getEmails_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      case kContactsService_getPhoto_name:
+        var params = ContactsServiceGetPhotoParams.deserialize(
+            message.payload);
+        var response = _impl.getPhoto(params.id,params.highResolution,_ContactsServiceGetPhotoResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kContactsService_getPhoto_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kContactsService_getPhoto_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  ContactsService get impl => _impl;
+  set impl(ContactsService d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "ContactsServiceStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+
diff --git a/mojo/dart/packages/mojo_services/lib/http_server/http_request.mojom.dart b/mojo/dart/packages/mojo_services/lib/http_server/http_request.mojom.dart
new file mode 100644
index 0000000..e3f54b2
--- /dev/null
+++ b/mojo/dart/packages/mojo_services/lib/http_server/http_request.mojom.dart
@@ -0,0 +1,159 @@
+// 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.
+
+library http_request_mojom;
+
+import 'dart:async';
+
+import 'package:mojo/bindings.dart' as bindings;
+import 'package:mojo/core.dart' as core;
+
+
+
+class HttpRequest extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(40, 0)
+  ];
+  String relativeUrl = null;
+  String method = "GET";
+  Map<String, String> headers = null;
+  core.MojoDataPipeConsumer body = null;
+
+  HttpRequest() : super(kVersions.last.size);
+
+  static HttpRequest deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static HttpRequest decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    HttpRequest result = new HttpRequest();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.relativeUrl = decoder0.decodeString(8, false);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.method = decoder0.decodeString(16, false);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(24, true);
+      if (decoder1 == null) {
+        result.headers = null;
+      } else {
+        decoder1.decodeDataHeaderForMap();
+        List<String> keys0;
+        List<String> values0;
+        {
+          
+          var decoder2 = decoder1.decodePointer(bindings.ArrayDataHeader.kHeaderSize, false);
+          {
+            var si2 = decoder2.decodeDataHeaderForPointerArray(bindings.kUnspecifiedArrayLength);
+            keys0 = new List<String>(si2.numElements);
+            for (int i2 = 0; i2 < si2.numElements; ++i2) {
+              
+              keys0[i2] = decoder2.decodeString(bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i2, false);
+            }
+          }
+        }
+        {
+          
+          var decoder2 = decoder1.decodePointer(bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize, false);
+          {
+            var si2 = decoder2.decodeDataHeaderForPointerArray(keys0.length);
+            values0 = new List<String>(si2.numElements);
+            for (int i2 = 0; i2 < si2.numElements; ++i2) {
+              
+              values0[i2] = decoder2.decodeString(bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i2, false);
+            }
+          }
+        }
+        result.headers = new Map<String, String>.fromIterables(
+            keys0, values0);
+      }
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.body = decoder0.decodeConsumerHandle(32, true);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeString(relativeUrl, 8, false);
+    
+    encoder0.encodeString(method, 16, false);
+    
+    if (headers == null) {
+      encoder0.encodeNullPointer(24, true);
+    } else {
+      var encoder1 = encoder0.encoderForMap(24);
+      int size0 = headers.length;
+      var keys0 = headers.keys.toList();
+      var values0 = headers.values.toList();
+      
+      {
+        var encoder2 = encoder1.encodePointerArray(keys0.length, bindings.ArrayDataHeader.kHeaderSize, bindings.kUnspecifiedArrayLength);
+        for (int i1 = 0; i1 < keys0.length; ++i1) {
+          
+          encoder2.encodeString(keys0[i1], bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i1, false);
+        }
+      }
+      
+      {
+        var encoder2 = encoder1.encodePointerArray(values0.length, bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize, bindings.kUnspecifiedArrayLength);
+        for (int i1 = 0; i1 < values0.length; ++i1) {
+          
+          encoder2.encodeString(values0[i1], bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i1, false);
+        }
+      }
+    }
+    
+    encoder0.encodeConsumerHandle(body, 32, true);
+  }
+
+  String toString() {
+    return "HttpRequest("
+           "relativeUrl: $relativeUrl" ", "
+           "method: $method" ", "
+           "headers: $headers" ", "
+           "body: $body" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+
diff --git a/mojo/dart/packages/mojo_services/lib/http_server/http_response.mojom.dart b/mojo/dart/packages/mojo_services/lib/http_server/http_response.mojom.dart
new file mode 100644
index 0000000..a532a86
--- /dev/null
+++ b/mojo/dart/packages/mojo_services/lib/http_server/http_response.mojom.dart
@@ -0,0 +1,167 @@
+// 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.
+
+library http_response_mojom;
+
+import 'dart:async';
+
+import 'package:mojo/bindings.dart' as bindings;
+import 'package:mojo/core.dart' as core;
+
+
+
+class HttpResponse extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(40, 0)
+  ];
+  int statusCode = 200;
+  core.MojoDataPipeConsumer body = null;
+  int contentLength = 0;
+  String contentType = "text/html; charset=utf-8";
+  Map<String, String> customHeaders = null;
+
+  HttpResponse() : super(kVersions.last.size);
+
+  static HttpResponse deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static HttpResponse decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    HttpResponse result = new HttpResponse();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.statusCode = decoder0.decodeUint32(8);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.body = decoder0.decodeConsumerHandle(12, true);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.contentLength = decoder0.decodeInt64(16);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.contentType = decoder0.decodeString(24, false);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(32, true);
+      if (decoder1 == null) {
+        result.customHeaders = null;
+      } else {
+        decoder1.decodeDataHeaderForMap();
+        List<String> keys0;
+        List<String> values0;
+        {
+          
+          var decoder2 = decoder1.decodePointer(bindings.ArrayDataHeader.kHeaderSize, false);
+          {
+            var si2 = decoder2.decodeDataHeaderForPointerArray(bindings.kUnspecifiedArrayLength);
+            keys0 = new List<String>(si2.numElements);
+            for (int i2 = 0; i2 < si2.numElements; ++i2) {
+              
+              keys0[i2] = decoder2.decodeString(bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i2, false);
+            }
+          }
+        }
+        {
+          
+          var decoder2 = decoder1.decodePointer(bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize, false);
+          {
+            var si2 = decoder2.decodeDataHeaderForPointerArray(keys0.length);
+            values0 = new List<String>(si2.numElements);
+            for (int i2 = 0; i2 < si2.numElements; ++i2) {
+              
+              values0[i2] = decoder2.decodeString(bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i2, false);
+            }
+          }
+        }
+        result.customHeaders = new Map<String, String>.fromIterables(
+            keys0, values0);
+      }
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeUint32(statusCode, 8);
+    
+    encoder0.encodeConsumerHandle(body, 12, true);
+    
+    encoder0.encodeInt64(contentLength, 16);
+    
+    encoder0.encodeString(contentType, 24, false);
+    
+    if (customHeaders == null) {
+      encoder0.encodeNullPointer(32, true);
+    } else {
+      var encoder1 = encoder0.encoderForMap(32);
+      int size0 = customHeaders.length;
+      var keys0 = customHeaders.keys.toList();
+      var values0 = customHeaders.values.toList();
+      
+      {
+        var encoder2 = encoder1.encodePointerArray(keys0.length, bindings.ArrayDataHeader.kHeaderSize, bindings.kUnspecifiedArrayLength);
+        for (int i1 = 0; i1 < keys0.length; ++i1) {
+          
+          encoder2.encodeString(keys0[i1], bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i1, false);
+        }
+      }
+      
+      {
+        var encoder2 = encoder1.encodePointerArray(values0.length, bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize, bindings.kUnspecifiedArrayLength);
+        for (int i1 = 0; i1 < values0.length; ++i1) {
+          
+          encoder2.encodeString(values0[i1], bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i1, false);
+        }
+      }
+    }
+  }
+
+  String toString() {
+    return "HttpResponse("
+           "statusCode: $statusCode" ", "
+           "body: $body" ", "
+           "contentLength: $contentLength" ", "
+           "contentType: $contentType" ", "
+           "customHeaders: $customHeaders" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+
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
new file mode 100644
index 0000000..8cec930
--- /dev/null
+++ b/mojo/dart/packages/mojo_services/lib/http_server/http_server.mojom.dart
@@ -0,0 +1,905 @@
+// 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.
+
+library http_server_mojom;
+
+import 'dart:async';
+
+import 'package:mojo/bindings.dart' as bindings;
+import 'package:mojo/core.dart' as core;
+import 'package:mojo_services/http_server/http_request.mojom.dart' as http_request_mojom;
+import 'package:mojo_services/http_server/http_response.mojom.dart' as http_response_mojom;
+
+
+
+class HttpServerSetHandlerParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  String pattern = null;
+  Object handler = null;
+
+  HttpServerSetHandlerParams() : super(kVersions.last.size);
+
+  static HttpServerSetHandlerParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static HttpServerSetHandlerParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    HttpServerSetHandlerParams result = new HttpServerSetHandlerParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.pattern = decoder0.decodeString(8, false);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.handler = decoder0.decodeServiceInterface(16, false, HttpHandlerProxy.newFromEndpoint);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeString(pattern, 8, false);
+    
+    encoder0.encodeInterface(handler, 16, false);
+  }
+
+  String toString() {
+    return "HttpServerSetHandlerParams("
+           "pattern: $pattern" ", "
+           "handler: $handler" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+
+class HttpServerSetHandlerResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  bool success = false;
+
+  HttpServerSetHandlerResponseParams() : super(kVersions.last.size);
+
+  static HttpServerSetHandlerResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static HttpServerSetHandlerResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    HttpServerSetHandlerResponseParams result = new HttpServerSetHandlerResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.success = decoder0.decodeBool(8, 0);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeBool(success, 8, 0);
+  }
+
+  String toString() {
+    return "HttpServerSetHandlerResponseParams("
+           "success: $success" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["success"] = success;
+    return map;
+  }
+}
+
+
+class HttpServerGetPortParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(8, 0)
+  ];
+
+  HttpServerGetPortParams() : super(kVersions.last.size);
+
+  static HttpServerGetPortParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static HttpServerGetPortParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    HttpServerGetPortParams result = new HttpServerGetPortParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    encoder.getStructEncoderAtOffset(kVersions.last);
+  }
+
+  String toString() {
+    return "HttpServerGetPortParams("")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    return map;
+  }
+}
+
+
+class HttpServerGetPortResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  int port = 0;
+
+  HttpServerGetPortResponseParams() : super(kVersions.last.size);
+
+  static HttpServerGetPortResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static HttpServerGetPortResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    HttpServerGetPortResponseParams result = new HttpServerGetPortResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.port = decoder0.decodeUint16(8);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeUint16(port, 8);
+  }
+
+  String toString() {
+    return "HttpServerGetPortResponseParams("
+           "port: $port" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["port"] = port;
+    return map;
+  }
+}
+
+
+class HttpHandlerHandleRequestParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  http_request_mojom.HttpRequest request = null;
+
+  HttpHandlerHandleRequestParams() : super(kVersions.last.size);
+
+  static HttpHandlerHandleRequestParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static HttpHandlerHandleRequestParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    HttpHandlerHandleRequestParams result = new HttpHandlerHandleRequestParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, false);
+      result.request = http_request_mojom.HttpRequest.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(request, 8, false);
+  }
+
+  String toString() {
+    return "HttpHandlerHandleRequestParams("
+           "request: $request" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+
+class HttpHandlerHandleRequestResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  http_response_mojom.HttpResponse response = null;
+
+  HttpHandlerHandleRequestResponseParams() : super(kVersions.last.size);
+
+  static HttpHandlerHandleRequestResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static HttpHandlerHandleRequestResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    HttpHandlerHandleRequestResponseParams result = new HttpHandlerHandleRequestResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, false);
+      result.response = http_response_mojom.HttpResponse.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(response, 8, false);
+  }
+
+  String toString() {
+    return "HttpHandlerHandleRequestResponseParams("
+           "response: $response" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+const int kHttpServer_setHandler_name = 0;
+const int kHttpServer_getPort_name = 1;
+
+const String HttpServerName =
+      'http_server::HttpServer';
+
+abstract class HttpServer {
+  dynamic setHandler(String pattern,Object handler,[Function responseFactory = null]);
+  dynamic getPort([Function responseFactory = null]);
+
+}
+
+
+class HttpServerProxyImpl extends bindings.Proxy {
+  HttpServerProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  HttpServerProxyImpl.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);
+  }
+
+  String get name => HttpServerName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      case kHttpServer_setHandler_name:
+        var r = HttpServerSetHandlerResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      case kHttpServer_getPort_name:
+        var r = HttpServerGetPortResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "HttpServerProxyImpl($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,
+          kHttpServer_setHandler_name,
+          -1,
+          bindings.MessageHeader.kMessageExpectsResponse);
+    }
+    dynamic getPort([Function responseFactory = null]) {
+      var params = new HttpServerGetPortParams();
+      return _proxyImpl.sendMessageWithRequestId(
+          params,
+          kHttpServer_getPort_name,
+          -1,
+          bindings.MessageHeader.kMessageExpectsResponse);
+    }
+}
+
+
+class HttpServerProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  HttpServer ptr;
+  final String name = HttpServerName;
+
+  HttpServerProxy(HttpServerProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _HttpServerProxyCalls(proxyImpl);
+
+  HttpServerProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new HttpServerProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _HttpServerProxyCalls(impl);
+  }
+
+  HttpServerProxy.fromHandle(core.MojoHandle handle) :
+      impl = new HttpServerProxyImpl.fromHandle(handle) {
+    ptr = new _HttpServerProxyCalls(impl);
+  }
+
+  HttpServerProxy.unbound() :
+      impl = new HttpServerProxyImpl.unbound() {
+    ptr = new _HttpServerProxyCalls(impl);
+  }
+
+  factory HttpServerProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    HttpServerProxy p = new HttpServerProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static HttpServerProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For HttpServerProxy"));
+    return new HttpServerProxy.fromEndpoint(endpoint);
+  }
+
+  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)";
+  }
+}
+
+
+class HttpServerStub extends bindings.Stub {
+  HttpServer _impl = null;
+
+  HttpServerStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  HttpServerStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  HttpServerStub.unbound() : super.unbound();
+
+  static HttpServerStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For HttpServerStub"));
+    return new HttpServerStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = HttpServerName;
+
+
+  HttpServerSetHandlerResponseParams _HttpServerSetHandlerResponseParamsFactory(bool success) {
+    var result = new HttpServerSetHandlerResponseParams();
+    result.success = success;
+    return result;
+  }
+  HttpServerGetPortResponseParams _HttpServerGetPortResponseParamsFactory(int port) {
+    var result = new HttpServerGetPortResponseParams();
+    result.port = port;
+    return result;
+  }
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      case kHttpServer_setHandler_name:
+        var params = HttpServerSetHandlerParams.deserialize(
+            message.payload);
+        var response = _impl.setHandler(params.pattern,params.handler,_HttpServerSetHandlerResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kHttpServer_setHandler_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kHttpServer_setHandler_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      case kHttpServer_getPort_name:
+        var params = HttpServerGetPortParams.deserialize(
+            message.payload);
+        var response = _impl.getPort(_HttpServerGetPortResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kHttpServer_getPort_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kHttpServer_getPort_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  HttpServer get impl => _impl;
+  set impl(HttpServer d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "HttpServerStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+const int kHttpHandler_handleRequest_name = 0;
+
+const String HttpHandlerName =
+      'http_server::HttpHandler';
+
+abstract class HttpHandler {
+  dynamic handleRequest(http_request_mojom.HttpRequest request,[Function responseFactory = null]);
+
+}
+
+
+class HttpHandlerProxyImpl extends bindings.Proxy {
+  HttpHandlerProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  HttpHandlerProxyImpl.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);
+  }
+
+  String get name => HttpHandlerName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      case kHttpHandler_handleRequest_name:
+        var r = HttpHandlerHandleRequestResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "HttpHandlerProxyImpl($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,
+          kHttpHandler_handleRequest_name,
+          -1,
+          bindings.MessageHeader.kMessageExpectsResponse);
+    }
+}
+
+
+class HttpHandlerProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  HttpHandler ptr;
+  final String name = HttpHandlerName;
+
+  HttpHandlerProxy(HttpHandlerProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _HttpHandlerProxyCalls(proxyImpl);
+
+  HttpHandlerProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new HttpHandlerProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _HttpHandlerProxyCalls(impl);
+  }
+
+  HttpHandlerProxy.fromHandle(core.MojoHandle handle) :
+      impl = new HttpHandlerProxyImpl.fromHandle(handle) {
+    ptr = new _HttpHandlerProxyCalls(impl);
+  }
+
+  HttpHandlerProxy.unbound() :
+      impl = new HttpHandlerProxyImpl.unbound() {
+    ptr = new _HttpHandlerProxyCalls(impl);
+  }
+
+  factory HttpHandlerProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    HttpHandlerProxy p = new HttpHandlerProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static HttpHandlerProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For HttpHandlerProxy"));
+    return new HttpHandlerProxy.fromEndpoint(endpoint);
+  }
+
+  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)";
+  }
+}
+
+
+class HttpHandlerStub extends bindings.Stub {
+  HttpHandler _impl = null;
+
+  HttpHandlerStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  HttpHandlerStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  HttpHandlerStub.unbound() : super.unbound();
+
+  static HttpHandlerStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For HttpHandlerStub"));
+    return new HttpHandlerStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = HttpHandlerName;
+
+
+  HttpHandlerHandleRequestResponseParams _HttpHandlerHandleRequestResponseParamsFactory(http_response_mojom.HttpResponse response) {
+    var result = new HttpHandlerHandleRequestResponseParams();
+    result.response = response;
+    return result;
+  }
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      case kHttpHandler_handleRequest_name:
+        var params = HttpHandlerHandleRequestParams.deserialize(
+            message.payload);
+        var response = _impl.handleRequest(params.request,_HttpHandlerHandleRequestResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kHttpHandler_handleRequest_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kHttpHandler_handleRequest_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  HttpHandler get impl => _impl;
+  set impl(HttpHandler d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "HttpHandlerStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+
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
new file mode 100644
index 0000000..22cbf0c
--- /dev/null
+++ b/mojo/dart/packages/mojo_services/lib/http_server/http_server_factory.mojom.dart
@@ -0,0 +1,266 @@
+// 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.
+
+library http_server_factory_mojom;
+
+import 'dart:async';
+
+import 'package:mojo/bindings.dart' as bindings;
+import 'package:mojo/core.dart' as core;
+import 'package:mojo_services/http_server/http_server.mojom.dart' as http_server_mojom;
+import 'package:mojo_services/mojo/net_address.mojom.dart' as net_address_mojom;
+
+
+
+class HttpServerFactoryCreateHttpServerParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  Object serverRequest = null;
+  net_address_mojom.NetAddress localAddress = null;
+
+  HttpServerFactoryCreateHttpServerParams() : super(kVersions.last.size);
+
+  static HttpServerFactoryCreateHttpServerParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static HttpServerFactoryCreateHttpServerParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    HttpServerFactoryCreateHttpServerParams result = new HttpServerFactoryCreateHttpServerParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.serverRequest = decoder0.decodeInterfaceRequest(8, false, http_server_mojom.HttpServerStub.newFromEndpoint);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(16, true);
+      result.localAddress = net_address_mojom.NetAddress.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeInterfaceRequest(serverRequest, 8, false);
+    
+    encoder0.encodeStruct(localAddress, 16, true);
+  }
+
+  String toString() {
+    return "HttpServerFactoryCreateHttpServerParams("
+           "serverRequest: $serverRequest" ", "
+           "localAddress: $localAddress" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+const int kHttpServerFactory_createHttpServer_name = 0;
+
+const String HttpServerFactoryName =
+      'http_server::HttpServerFactory';
+
+abstract class HttpServerFactory {
+  void createHttpServer(Object serverRequest, net_address_mojom.NetAddress localAddress);
+
+}
+
+
+class HttpServerFactoryProxyImpl extends bindings.Proxy {
+  HttpServerFactoryProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  HttpServerFactoryProxyImpl.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);
+  }
+
+  String get name => HttpServerFactoryName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "HttpServerFactoryProxyImpl($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, kHttpServerFactory_createHttpServer_name);
+    }
+  
+}
+
+
+class HttpServerFactoryProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  HttpServerFactory ptr;
+  final String name = HttpServerFactoryName;
+
+  HttpServerFactoryProxy(HttpServerFactoryProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _HttpServerFactoryProxyCalls(proxyImpl);
+
+  HttpServerFactoryProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new HttpServerFactoryProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _HttpServerFactoryProxyCalls(impl);
+  }
+
+  HttpServerFactoryProxy.fromHandle(core.MojoHandle handle) :
+      impl = new HttpServerFactoryProxyImpl.fromHandle(handle) {
+    ptr = new _HttpServerFactoryProxyCalls(impl);
+  }
+
+  HttpServerFactoryProxy.unbound() :
+      impl = new HttpServerFactoryProxyImpl.unbound() {
+    ptr = new _HttpServerFactoryProxyCalls(impl);
+  }
+
+  factory HttpServerFactoryProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    HttpServerFactoryProxy p = new HttpServerFactoryProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static HttpServerFactoryProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For HttpServerFactoryProxy"));
+    return new HttpServerFactoryProxy.fromEndpoint(endpoint);
+  }
+
+  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)";
+  }
+}
+
+
+class HttpServerFactoryStub extends bindings.Stub {
+  HttpServerFactory _impl = null;
+
+  HttpServerFactoryStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  HttpServerFactoryStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  HttpServerFactoryStub.unbound() : super.unbound();
+
+  static HttpServerFactoryStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For HttpServerFactoryStub"));
+    return new HttpServerFactoryStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = HttpServerFactoryName;
+
+
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      case kHttpServerFactory_createHttpServer_name:
+        var params = HttpServerFactoryCreateHttpServerParams.deserialize(
+            message.payload);
+        _impl.createHttpServer(params.serverRequest, params.localAddress);
+        break;
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  HttpServerFactory get impl => _impl;
+  set impl(HttpServerFactory d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "HttpServerFactoryStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+
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
new file mode 100644
index 0000000..36a8e08
--- /dev/null
+++ b/mojo/dart/packages/mojo_services/lib/icu_data/icu_data.mojom.dart
@@ -0,0 +1,362 @@
+// 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.
+
+library icu_data_mojom;
+
+import 'dart:async';
+
+import 'package:mojo/bindings.dart' as bindings;
+import 'package:mojo/core.dart' as core;
+
+
+
+class IcuDataMapParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  String sha1hash = null;
+
+  IcuDataMapParams() : super(kVersions.last.size);
+
+  static IcuDataMapParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static IcuDataMapParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    IcuDataMapParams result = new IcuDataMapParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.sha1hash = decoder0.decodeString(8, false);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeString(sha1hash, 8, false);
+  }
+
+  String toString() {
+    return "IcuDataMapParams("
+           "sha1hash: $sha1hash" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["sha1hash"] = sha1hash;
+    return map;
+  }
+}
+
+
+class IcuDataMapResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  core.MojoSharedBuffer icuData = null;
+
+  IcuDataMapResponseParams() : super(kVersions.last.size);
+
+  static IcuDataMapResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static IcuDataMapResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    IcuDataMapResponseParams result = new IcuDataMapResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.icuData = decoder0.decodeSharedBufferHandle(8, true);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeSharedBufferHandle(icuData, 8, true);
+  }
+
+  String toString() {
+    return "IcuDataMapResponseParams("
+           "icuData: $icuData" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+const int kIcuData_map_name = 0;
+
+const String IcuDataName =
+      'icu_data::ICUData';
+
+abstract class IcuData {
+  dynamic map(String sha1hash,[Function responseFactory = null]);
+
+}
+
+
+class IcuDataProxyImpl extends bindings.Proxy {
+  IcuDataProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  IcuDataProxyImpl.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);
+  }
+
+  String get name => IcuDataName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      case kIcuData_map_name:
+        var r = IcuDataMapResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "IcuDataProxyImpl($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,
+          kIcuData_map_name,
+          -1,
+          bindings.MessageHeader.kMessageExpectsResponse);
+    }
+}
+
+
+class IcuDataProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  IcuData ptr;
+  final String name = IcuDataName;
+
+  IcuDataProxy(IcuDataProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _IcuDataProxyCalls(proxyImpl);
+
+  IcuDataProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new IcuDataProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _IcuDataProxyCalls(impl);
+  }
+
+  IcuDataProxy.fromHandle(core.MojoHandle handle) :
+      impl = new IcuDataProxyImpl.fromHandle(handle) {
+    ptr = new _IcuDataProxyCalls(impl);
+  }
+
+  IcuDataProxy.unbound() :
+      impl = new IcuDataProxyImpl.unbound() {
+    ptr = new _IcuDataProxyCalls(impl);
+  }
+
+  factory IcuDataProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    IcuDataProxy p = new IcuDataProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static IcuDataProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For IcuDataProxy"));
+    return new IcuDataProxy.fromEndpoint(endpoint);
+  }
+
+  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)";
+  }
+}
+
+
+class IcuDataStub extends bindings.Stub {
+  IcuData _impl = null;
+
+  IcuDataStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  IcuDataStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  IcuDataStub.unbound() : super.unbound();
+
+  static IcuDataStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For IcuDataStub"));
+    return new IcuDataStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = IcuDataName;
+
+
+  IcuDataMapResponseParams _IcuDataMapResponseParamsFactory(core.MojoSharedBuffer icuData) {
+    var result = new IcuDataMapResponseParams();
+    result.icuData = icuData;
+    return result;
+  }
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      case kIcuData_map_name:
+        var params = IcuDataMapParams.deserialize(
+            message.payload);
+        var response = _impl.map(params.sha1hash,_IcuDataMapResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kIcuData_map_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kIcuData_map_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  IcuData get impl => _impl;
+  set impl(IcuData d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "IcuDataStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+
diff --git a/mojo/dart/packages/mojo_services/lib/input/input.mojom.dart b/mojo/dart/packages/mojo_services/lib/input/input.mojom.dart
new file mode 100644
index 0000000..7ba4a92
--- /dev/null
+++ b/mojo/dart/packages/mojo_services/lib/input/input.mojom.dart
@@ -0,0 +1,584 @@
+// 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.
+
+library input_mojom;
+
+import 'dart:async';
+
+import 'package:mojo/bindings.dart' as bindings;
+import 'package:mojo/core.dart' as core;
+
+
+
+class InputClientOnBackButtonParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(8, 0)
+  ];
+
+  InputClientOnBackButtonParams() : super(kVersions.last.size);
+
+  static InputClientOnBackButtonParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static InputClientOnBackButtonParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    InputClientOnBackButtonParams result = new InputClientOnBackButtonParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    encoder.getStructEncoderAtOffset(kVersions.last);
+  }
+
+  String toString() {
+    return "InputClientOnBackButtonParams("")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    return map;
+  }
+}
+
+
+class InputClientOnBackButtonResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(8, 0)
+  ];
+
+  InputClientOnBackButtonResponseParams() : super(kVersions.last.size);
+
+  static InputClientOnBackButtonResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static InputClientOnBackButtonResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    InputClientOnBackButtonResponseParams result = new InputClientOnBackButtonResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    encoder.getStructEncoderAtOffset(kVersions.last);
+  }
+
+  String toString() {
+    return "InputClientOnBackButtonResponseParams("")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    return map;
+  }
+}
+
+
+class InputServiceSetClientParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  Object client = null;
+
+  InputServiceSetClientParams() : super(kVersions.last.size);
+
+  static InputServiceSetClientParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static InputServiceSetClientParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    InputServiceSetClientParams result = new InputServiceSetClientParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.client = decoder0.decodeServiceInterface(8, false, InputClientProxy.newFromEndpoint);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeInterface(client, 8, false);
+  }
+
+  String toString() {
+    return "InputServiceSetClientParams("
+           "client: $client" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+const int kInputClient_onBackButton_name = 0;
+
+const String InputClientName =
+      'input::InputClient';
+
+abstract class InputClient {
+  dynamic onBackButton([Function responseFactory = null]);
+
+}
+
+
+class InputClientProxyImpl extends bindings.Proxy {
+  InputClientProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  InputClientProxyImpl.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);
+  }
+
+  String get name => InputClientName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      case kInputClient_onBackButton_name:
+        var r = InputClientOnBackButtonResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "InputClientProxyImpl($superString)";
+  }
+}
+
+
+class _InputClientProxyCalls implements InputClient {
+  InputClientProxyImpl _proxyImpl;
+
+  _InputClientProxyCalls(this._proxyImpl);
+    dynamic onBackButton([Function responseFactory = null]) {
+      var params = new InputClientOnBackButtonParams();
+      return _proxyImpl.sendMessageWithRequestId(
+          params,
+          kInputClient_onBackButton_name,
+          -1,
+          bindings.MessageHeader.kMessageExpectsResponse);
+    }
+}
+
+
+class InputClientProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  InputClient ptr;
+  final String name = InputClientName;
+
+  InputClientProxy(InputClientProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _InputClientProxyCalls(proxyImpl);
+
+  InputClientProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new InputClientProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _InputClientProxyCalls(impl);
+  }
+
+  InputClientProxy.fromHandle(core.MojoHandle handle) :
+      impl = new InputClientProxyImpl.fromHandle(handle) {
+    ptr = new _InputClientProxyCalls(impl);
+  }
+
+  InputClientProxy.unbound() :
+      impl = new InputClientProxyImpl.unbound() {
+    ptr = new _InputClientProxyCalls(impl);
+  }
+
+  factory InputClientProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    InputClientProxy p = new InputClientProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static InputClientProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For InputClientProxy"));
+    return new InputClientProxy.fromEndpoint(endpoint);
+  }
+
+  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)";
+  }
+}
+
+
+class InputClientStub extends bindings.Stub {
+  InputClient _impl = null;
+
+  InputClientStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  InputClientStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  InputClientStub.unbound() : super.unbound();
+
+  static InputClientStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For InputClientStub"));
+    return new InputClientStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = InputClientName;
+
+
+  InputClientOnBackButtonResponseParams _InputClientOnBackButtonResponseParamsFactory() {
+    var result = new InputClientOnBackButtonResponseParams();
+    return result;
+  }
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      case kInputClient_onBackButton_name:
+        var params = InputClientOnBackButtonParams.deserialize(
+            message.payload);
+        var response = _impl.onBackButton(_InputClientOnBackButtonResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kInputClient_onBackButton_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kInputClient_onBackButton_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  InputClient get impl => _impl;
+  set impl(InputClient d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "InputClientStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+const int kInputService_setClient_name = 0;
+
+const String InputServiceName =
+      'input::InputService';
+
+abstract class InputService {
+  void setClient(Object client);
+
+}
+
+
+class InputServiceProxyImpl extends bindings.Proxy {
+  InputServiceProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  InputServiceProxyImpl.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);
+  }
+
+  String get name => InputServiceName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "InputServiceProxyImpl($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, kInputService_setClient_name);
+    }
+  
+}
+
+
+class InputServiceProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  InputService ptr;
+  final String name = InputServiceName;
+
+  InputServiceProxy(InputServiceProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _InputServiceProxyCalls(proxyImpl);
+
+  InputServiceProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new InputServiceProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _InputServiceProxyCalls(impl);
+  }
+
+  InputServiceProxy.fromHandle(core.MojoHandle handle) :
+      impl = new InputServiceProxyImpl.fromHandle(handle) {
+    ptr = new _InputServiceProxyCalls(impl);
+  }
+
+  InputServiceProxy.unbound() :
+      impl = new InputServiceProxyImpl.unbound() {
+    ptr = new _InputServiceProxyCalls(impl);
+  }
+
+  factory InputServiceProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    InputServiceProxy p = new InputServiceProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static InputServiceProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For InputServiceProxy"));
+    return new InputServiceProxy.fromEndpoint(endpoint);
+  }
+
+  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)";
+  }
+}
+
+
+class InputServiceStub extends bindings.Stub {
+  InputService _impl = null;
+
+  InputServiceStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  InputServiceStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  InputServiceStub.unbound() : super.unbound();
+
+  static InputServiceStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For InputServiceStub"));
+    return new InputServiceStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = InputServiceName;
+
+
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      case kInputService_setClient_name:
+        var params = InputServiceSetClientParams.deserialize(
+            message.payload);
+        _impl.setClient(params.client);
+        break;
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  InputService get impl => _impl;
+  set impl(InputService d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "InputServiceStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+
diff --git a/mojo/dart/packages/mojo_services/lib/keyboard/keyboard.mojom.dart b/mojo/dart/packages/mojo_services/lib/keyboard/keyboard.mojom.dart
new file mode 100644
index 0000000..7e7f67d
--- /dev/null
+++ b/mojo/dart/packages/mojo_services/lib/keyboard/keyboard.mojom.dart
@@ -0,0 +1,1763 @@
+// 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.
+
+library keyboard_mojom;
+
+import 'dart:async';
+
+import 'package:mojo/bindings.dart' as bindings;
+import 'package:mojo/core.dart' as core;
+class SubmitAction extends bindings.MojoEnum {
+  static const DONE = const SubmitAction._(0);
+
+  const SubmitAction._(int v) : super(v);
+
+  static const Map<String, SubmitAction> valuesMap = const {
+    "DONE": DONE,
+  };
+  static const List<SubmitAction> values = const [
+    DONE,
+  ];
+
+  static SubmitAction valueOf(String name) => valuesMap[name];
+
+  factory SubmitAction(int v) {
+    switch (v) {
+      case 0:
+        return DONE;
+      default:
+        return null;
+    }
+  }
+
+  static SubmitAction decode(bindings.Decoder decoder0, int offset) {
+    int v = decoder0.decodeUint32(offset);
+    SubmitAction result = new SubmitAction(v);
+    if (result == null) {
+      throw new bindings.MojoCodecError(
+          'Bad value $v for enum SubmitAction.');
+    }
+    return result;
+  }
+
+  String toString() {
+    switch(this) {
+      case DONE:
+        return 'SubmitAction.DONE';
+    }
+  }
+
+  int toJson() => value;
+}
+class KeyboardType extends bindings.MojoEnum {
+  static const TEXT = const KeyboardType._(0);
+  static const NUMBER = const KeyboardType._(1);
+  static const PHONE = const KeyboardType._(2);
+  static const DATETIME = const KeyboardType._(3);
+
+  const KeyboardType._(int v) : super(v);
+
+  static const Map<String, KeyboardType> valuesMap = const {
+    "TEXT": TEXT,
+    "NUMBER": NUMBER,
+    "PHONE": PHONE,
+    "DATETIME": DATETIME,
+  };
+  static const List<KeyboardType> values = const [
+    TEXT,
+    NUMBER,
+    PHONE,
+    DATETIME,
+  ];
+
+  static KeyboardType valueOf(String name) => valuesMap[name];
+
+  factory KeyboardType(int v) {
+    switch (v) {
+      case 0:
+        return TEXT;
+      case 1:
+        return NUMBER;
+      case 2:
+        return PHONE;
+      case 3:
+        return DATETIME;
+      default:
+        return null;
+    }
+  }
+
+  static KeyboardType decode(bindings.Decoder decoder0, int offset) {
+    int v = decoder0.decodeUint32(offset);
+    KeyboardType result = new KeyboardType(v);
+    if (result == null) {
+      throw new bindings.MojoCodecError(
+          'Bad value $v for enum KeyboardType.');
+    }
+    return result;
+  }
+
+  String toString() {
+    switch(this) {
+      case TEXT:
+        return 'KeyboardType.TEXT';
+      case NUMBER:
+        return 'KeyboardType.NUMBER';
+      case PHONE:
+        return 'KeyboardType.PHONE';
+      case DATETIME:
+        return 'KeyboardType.DATETIME';
+    }
+  }
+
+  int toJson() => value;
+}
+
+
+
+class CompletionData extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(40, 0)
+  ];
+  int id = 0;
+  int position = 0;
+  String text = null;
+  String label = null;
+
+  CompletionData() : super(kVersions.last.size);
+
+  static CompletionData deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static CompletionData decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    CompletionData result = new CompletionData();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.id = decoder0.decodeInt64(8);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.position = decoder0.decodeInt32(16);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.text = decoder0.decodeString(24, false);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.label = decoder0.decodeString(32, false);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeInt64(id, 8);
+    
+    encoder0.encodeInt32(position, 16);
+    
+    encoder0.encodeString(text, 24, false);
+    
+    encoder0.encodeString(label, 32, false);
+  }
+
+  String toString() {
+    return "CompletionData("
+           "id: $id" ", "
+           "position: $position" ", "
+           "text: $text" ", "
+           "label: $label" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["id"] = id;
+    map["position"] = position;
+    map["text"] = text;
+    map["label"] = label;
+    return map;
+  }
+}
+
+
+class CorrectionData extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(32, 0)
+  ];
+  int offset = 0;
+  String oldText = null;
+  String newText = null;
+
+  CorrectionData() : super(kVersions.last.size);
+
+  static CorrectionData deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static CorrectionData decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    CorrectionData result = new CorrectionData();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.offset = decoder0.decodeInt32(8);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.oldText = decoder0.decodeString(16, false);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.newText = decoder0.decodeString(24, false);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeInt32(offset, 8);
+    
+    encoder0.encodeString(oldText, 16, false);
+    
+    encoder0.encodeString(newText, 24, false);
+  }
+
+  String toString() {
+    return "CorrectionData("
+           "offset: $offset" ", "
+           "oldText: $oldText" ", "
+           "newText: $newText" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["offset"] = offset;
+    map["oldText"] = oldText;
+    map["newText"] = newText;
+    return map;
+  }
+}
+
+
+class KeyboardClientCommitCompletionParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  CompletionData completion = null;
+
+  KeyboardClientCommitCompletionParams() : super(kVersions.last.size);
+
+  static KeyboardClientCommitCompletionParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static KeyboardClientCommitCompletionParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    KeyboardClientCommitCompletionParams result = new KeyboardClientCommitCompletionParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, false);
+      result.completion = CompletionData.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(completion, 8, false);
+  }
+
+  String toString() {
+    return "KeyboardClientCommitCompletionParams("
+           "completion: $completion" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["completion"] = completion;
+    return map;
+  }
+}
+
+
+class KeyboardClientCommitCorrectionParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  CorrectionData correction = null;
+
+  KeyboardClientCommitCorrectionParams() : super(kVersions.last.size);
+
+  static KeyboardClientCommitCorrectionParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static KeyboardClientCommitCorrectionParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    KeyboardClientCommitCorrectionParams result = new KeyboardClientCommitCorrectionParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, false);
+      result.correction = CorrectionData.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(correction, 8, false);
+  }
+
+  String toString() {
+    return "KeyboardClientCommitCorrectionParams("
+           "correction: $correction" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["correction"] = correction;
+    return map;
+  }
+}
+
+
+class KeyboardClientCommitTextParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  String text = null;
+  int newCursorPosition = 0;
+
+  KeyboardClientCommitTextParams() : super(kVersions.last.size);
+
+  static KeyboardClientCommitTextParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static KeyboardClientCommitTextParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    KeyboardClientCommitTextParams result = new KeyboardClientCommitTextParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.text = decoder0.decodeString(8, false);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.newCursorPosition = decoder0.decodeInt32(16);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeString(text, 8, false);
+    
+    encoder0.encodeInt32(newCursorPosition, 16);
+  }
+
+  String toString() {
+    return "KeyboardClientCommitTextParams("
+           "text: $text" ", "
+           "newCursorPosition: $newCursorPosition" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["text"] = text;
+    map["newCursorPosition"] = newCursorPosition;
+    return map;
+  }
+}
+
+
+class KeyboardClientDeleteSurroundingTextParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  int beforeLength = 0;
+  int afterLength = 0;
+
+  KeyboardClientDeleteSurroundingTextParams() : super(kVersions.last.size);
+
+  static KeyboardClientDeleteSurroundingTextParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static KeyboardClientDeleteSurroundingTextParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    KeyboardClientDeleteSurroundingTextParams result = new KeyboardClientDeleteSurroundingTextParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.beforeLength = decoder0.decodeInt32(8);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.afterLength = decoder0.decodeInt32(12);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeInt32(beforeLength, 8);
+    
+    encoder0.encodeInt32(afterLength, 12);
+  }
+
+  String toString() {
+    return "KeyboardClientDeleteSurroundingTextParams("
+           "beforeLength: $beforeLength" ", "
+           "afterLength: $afterLength" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["beforeLength"] = beforeLength;
+    map["afterLength"] = afterLength;
+    return map;
+  }
+}
+
+
+class KeyboardClientSetComposingRegionParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  int start = 0;
+  int end = 0;
+
+  KeyboardClientSetComposingRegionParams() : super(kVersions.last.size);
+
+  static KeyboardClientSetComposingRegionParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static KeyboardClientSetComposingRegionParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    KeyboardClientSetComposingRegionParams result = new KeyboardClientSetComposingRegionParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.start = decoder0.decodeInt32(8);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.end = decoder0.decodeInt32(12);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeInt32(start, 8);
+    
+    encoder0.encodeInt32(end, 12);
+  }
+
+  String toString() {
+    return "KeyboardClientSetComposingRegionParams("
+           "start: $start" ", "
+           "end: $end" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["start"] = start;
+    map["end"] = end;
+    return map;
+  }
+}
+
+
+class KeyboardClientSetComposingTextParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  String text = null;
+  int newCursorPosition = 0;
+
+  KeyboardClientSetComposingTextParams() : super(kVersions.last.size);
+
+  static KeyboardClientSetComposingTextParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static KeyboardClientSetComposingTextParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    KeyboardClientSetComposingTextParams result = new KeyboardClientSetComposingTextParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.text = decoder0.decodeString(8, false);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.newCursorPosition = decoder0.decodeInt32(16);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeString(text, 8, false);
+    
+    encoder0.encodeInt32(newCursorPosition, 16);
+  }
+
+  String toString() {
+    return "KeyboardClientSetComposingTextParams("
+           "text: $text" ", "
+           "newCursorPosition: $newCursorPosition" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["text"] = text;
+    map["newCursorPosition"] = newCursorPosition;
+    return map;
+  }
+}
+
+
+class KeyboardClientSetSelectionParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  int start = 0;
+  int end = 0;
+
+  KeyboardClientSetSelectionParams() : super(kVersions.last.size);
+
+  static KeyboardClientSetSelectionParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static KeyboardClientSetSelectionParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    KeyboardClientSetSelectionParams result = new KeyboardClientSetSelectionParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.start = decoder0.decodeInt32(8);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.end = decoder0.decodeInt32(12);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeInt32(start, 8);
+    
+    encoder0.encodeInt32(end, 12);
+  }
+
+  String toString() {
+    return "KeyboardClientSetSelectionParams("
+           "start: $start" ", "
+           "end: $end" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["start"] = start;
+    map["end"] = end;
+    return map;
+  }
+}
+
+
+class KeyboardClientSubmitParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  SubmitAction action = null;
+
+  KeyboardClientSubmitParams() : super(kVersions.last.size);
+
+  static KeyboardClientSubmitParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static KeyboardClientSubmitParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    KeyboardClientSubmitParams result = new KeyboardClientSubmitParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+        result.action = SubmitAction.decode(decoder0, 8);
+        if (result.action == null) {
+          throw new bindings.MojoCodecError(
+            'Trying to decode null union for non-nullable SubmitAction.');
+        }
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeEnum(action, 8);
+  }
+
+  String toString() {
+    return "KeyboardClientSubmitParams("
+           "action: $action" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["action"] = action;
+    return map;
+  }
+}
+
+
+class KeyboardServiceShowParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  Object client = null;
+  KeyboardType type = null;
+
+  KeyboardServiceShowParams() : super(kVersions.last.size);
+
+  static KeyboardServiceShowParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static KeyboardServiceShowParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    KeyboardServiceShowParams result = new KeyboardServiceShowParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.client = decoder0.decodeServiceInterface(8, false, KeyboardClientProxy.newFromEndpoint);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+        result.type = KeyboardType.decode(decoder0, 16);
+        if (result.type == null) {
+          throw new bindings.MojoCodecError(
+            'Trying to decode null union for non-nullable KeyboardType.');
+        }
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeInterface(client, 8, false);
+    
+    encoder0.encodeEnum(type, 16);
+  }
+
+  String toString() {
+    return "KeyboardServiceShowParams("
+           "client: $client" ", "
+           "type: $type" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+
+class KeyboardServiceShowByRequestParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(8, 0)
+  ];
+
+  KeyboardServiceShowByRequestParams() : super(kVersions.last.size);
+
+  static KeyboardServiceShowByRequestParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static KeyboardServiceShowByRequestParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    KeyboardServiceShowByRequestParams result = new KeyboardServiceShowByRequestParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    encoder.getStructEncoderAtOffset(kVersions.last);
+  }
+
+  String toString() {
+    return "KeyboardServiceShowByRequestParams("")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    return map;
+  }
+}
+
+
+class KeyboardServiceHideParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(8, 0)
+  ];
+
+  KeyboardServiceHideParams() : super(kVersions.last.size);
+
+  static KeyboardServiceHideParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static KeyboardServiceHideParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    KeyboardServiceHideParams result = new KeyboardServiceHideParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    encoder.getStructEncoderAtOffset(kVersions.last);
+  }
+
+  String toString() {
+    return "KeyboardServiceHideParams("")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    return map;
+  }
+}
+
+
+class KeyboardServiceSetTextParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  String text = null;
+
+  KeyboardServiceSetTextParams() : super(kVersions.last.size);
+
+  static KeyboardServiceSetTextParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static KeyboardServiceSetTextParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    KeyboardServiceSetTextParams result = new KeyboardServiceSetTextParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.text = decoder0.decodeString(8, false);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeString(text, 8, false);
+  }
+
+  String toString() {
+    return "KeyboardServiceSetTextParams("
+           "text: $text" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["text"] = text;
+    return map;
+  }
+}
+
+
+class KeyboardServiceSetSelectionParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  int start = 0;
+  int end = 0;
+
+  KeyboardServiceSetSelectionParams() : super(kVersions.last.size);
+
+  static KeyboardServiceSetSelectionParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static KeyboardServiceSetSelectionParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    KeyboardServiceSetSelectionParams result = new KeyboardServiceSetSelectionParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.start = decoder0.decodeInt32(8);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.end = decoder0.decodeInt32(12);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeInt32(start, 8);
+    
+    encoder0.encodeInt32(end, 12);
+  }
+
+  String toString() {
+    return "KeyboardServiceSetSelectionParams("
+           "start: $start" ", "
+           "end: $end" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["start"] = start;
+    map["end"] = end;
+    return map;
+  }
+}
+
+const int kKeyboardClient_commitCompletion_name = 0;
+const int kKeyboardClient_commitCorrection_name = 1;
+const int kKeyboardClient_commitText_name = 2;
+const int kKeyboardClient_deleteSurroundingText_name = 3;
+const int kKeyboardClient_setComposingRegion_name = 4;
+const int kKeyboardClient_setComposingText_name = 5;
+const int kKeyboardClient_setSelection_name = 6;
+const int kKeyboardClient_submit_name = 7;
+
+const String KeyboardClientName =
+      'keyboard::KeyboardClient';
+
+abstract class KeyboardClient {
+  void commitCompletion(CompletionData completion);
+  void commitCorrection(CorrectionData correction);
+  void commitText(String text, int newCursorPosition);
+  void deleteSurroundingText(int beforeLength, int afterLength);
+  void setComposingRegion(int start, int end);
+  void setComposingText(String text, int newCursorPosition);
+  void setSelection(int start, int end);
+  void submit(SubmitAction action);
+
+}
+
+
+class KeyboardClientProxyImpl extends bindings.Proxy {
+  KeyboardClientProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  KeyboardClientProxyImpl.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);
+  }
+
+  String get name => KeyboardClientName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "KeyboardClientProxyImpl($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, kKeyboardClient_commitCompletion_name);
+    }
+  
+    void commitCorrection(CorrectionData correction) {
+      if (!_proxyImpl.isBound) {
+        _proxyImpl.proxyError("The Proxy is closed.");
+        return;
+      }
+      var params = new KeyboardClientCommitCorrectionParams();
+      params.correction = correction;
+      _proxyImpl.sendMessage(params, kKeyboardClient_commitCorrection_name);
+    }
+  
+    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, kKeyboardClient_commitText_name);
+    }
+  
+    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, kKeyboardClient_deleteSurroundingText_name);
+    }
+  
+    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, kKeyboardClient_setComposingRegion_name);
+    }
+  
+    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, kKeyboardClient_setComposingText_name);
+    }
+  
+    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, kKeyboardClient_setSelection_name);
+    }
+  
+    void submit(SubmitAction action) {
+      if (!_proxyImpl.isBound) {
+        _proxyImpl.proxyError("The Proxy is closed.");
+        return;
+      }
+      var params = new KeyboardClientSubmitParams();
+      params.action = action;
+      _proxyImpl.sendMessage(params, kKeyboardClient_submit_name);
+    }
+  
+}
+
+
+class KeyboardClientProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  KeyboardClient ptr;
+  final String name = KeyboardClientName;
+
+  KeyboardClientProxy(KeyboardClientProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _KeyboardClientProxyCalls(proxyImpl);
+
+  KeyboardClientProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new KeyboardClientProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _KeyboardClientProxyCalls(impl);
+  }
+
+  KeyboardClientProxy.fromHandle(core.MojoHandle handle) :
+      impl = new KeyboardClientProxyImpl.fromHandle(handle) {
+    ptr = new _KeyboardClientProxyCalls(impl);
+  }
+
+  KeyboardClientProxy.unbound() :
+      impl = new KeyboardClientProxyImpl.unbound() {
+    ptr = new _KeyboardClientProxyCalls(impl);
+  }
+
+  factory KeyboardClientProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    KeyboardClientProxy p = new KeyboardClientProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static KeyboardClientProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For KeyboardClientProxy"));
+    return new KeyboardClientProxy.fromEndpoint(endpoint);
+  }
+
+  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 "KeyboardClientProxy($impl)";
+  }
+}
+
+
+class KeyboardClientStub extends bindings.Stub {
+  KeyboardClient _impl = null;
+
+  KeyboardClientStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  KeyboardClientStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  KeyboardClientStub.unbound() : super.unbound();
+
+  static KeyboardClientStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For KeyboardClientStub"));
+    return new KeyboardClientStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = KeyboardClientName;
+
+
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      case kKeyboardClient_commitCompletion_name:
+        var params = KeyboardClientCommitCompletionParams.deserialize(
+            message.payload);
+        _impl.commitCompletion(params.completion);
+        break;
+      case kKeyboardClient_commitCorrection_name:
+        var params = KeyboardClientCommitCorrectionParams.deserialize(
+            message.payload);
+        _impl.commitCorrection(params.correction);
+        break;
+      case kKeyboardClient_commitText_name:
+        var params = KeyboardClientCommitTextParams.deserialize(
+            message.payload);
+        _impl.commitText(params.text, params.newCursorPosition);
+        break;
+      case kKeyboardClient_deleteSurroundingText_name:
+        var params = KeyboardClientDeleteSurroundingTextParams.deserialize(
+            message.payload);
+        _impl.deleteSurroundingText(params.beforeLength, params.afterLength);
+        break;
+      case kKeyboardClient_setComposingRegion_name:
+        var params = KeyboardClientSetComposingRegionParams.deserialize(
+            message.payload);
+        _impl.setComposingRegion(params.start, params.end);
+        break;
+      case kKeyboardClient_setComposingText_name:
+        var params = KeyboardClientSetComposingTextParams.deserialize(
+            message.payload);
+        _impl.setComposingText(params.text, params.newCursorPosition);
+        break;
+      case kKeyboardClient_setSelection_name:
+        var params = KeyboardClientSetSelectionParams.deserialize(
+            message.payload);
+        _impl.setSelection(params.start, params.end);
+        break;
+      case kKeyboardClient_submit_name:
+        var params = KeyboardClientSubmitParams.deserialize(
+            message.payload);
+        _impl.submit(params.action);
+        break;
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  KeyboardClient get impl => _impl;
+  set impl(KeyboardClient d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "KeyboardClientStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+const int kKeyboardService_show_name = 0;
+const int kKeyboardService_showByRequest_name = 1;
+const int kKeyboardService_hide_name = 2;
+const int kKeyboardService_setText_name = 3;
+const int kKeyboardService_setSelection_name = 4;
+
+const String KeyboardServiceName =
+      'keyboard::KeyboardService';
+
+abstract class KeyboardService {
+  void show(Object client, KeyboardType type);
+  void showByRequest();
+  void hide();
+  void setText(String text);
+  void setSelection(int start, int end);
+
+}
+
+
+class KeyboardServiceProxyImpl extends bindings.Proxy {
+  KeyboardServiceProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  KeyboardServiceProxyImpl.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);
+  }
+
+  String get name => KeyboardServiceName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "KeyboardServiceProxyImpl($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, kKeyboardService_show_name);
+    }
+  
+    void showByRequest() {
+      if (!_proxyImpl.isBound) {
+        _proxyImpl.proxyError("The Proxy is closed.");
+        return;
+      }
+      var params = new KeyboardServiceShowByRequestParams();
+      _proxyImpl.sendMessage(params, kKeyboardService_showByRequest_name);
+    }
+  
+    void hide() {
+      if (!_proxyImpl.isBound) {
+        _proxyImpl.proxyError("The Proxy is closed.");
+        return;
+      }
+      var params = new KeyboardServiceHideParams();
+      _proxyImpl.sendMessage(params, kKeyboardService_hide_name);
+    }
+  
+    void setText(String text) {
+      if (!_proxyImpl.isBound) {
+        _proxyImpl.proxyError("The Proxy is closed.");
+        return;
+      }
+      var params = new KeyboardServiceSetTextParams();
+      params.text = text;
+      _proxyImpl.sendMessage(params, kKeyboardService_setText_name);
+    }
+  
+    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, kKeyboardService_setSelection_name);
+    }
+  
+}
+
+
+class KeyboardServiceProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  KeyboardService ptr;
+  final String name = KeyboardServiceName;
+
+  KeyboardServiceProxy(KeyboardServiceProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _KeyboardServiceProxyCalls(proxyImpl);
+
+  KeyboardServiceProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new KeyboardServiceProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _KeyboardServiceProxyCalls(impl);
+  }
+
+  KeyboardServiceProxy.fromHandle(core.MojoHandle handle) :
+      impl = new KeyboardServiceProxyImpl.fromHandle(handle) {
+    ptr = new _KeyboardServiceProxyCalls(impl);
+  }
+
+  KeyboardServiceProxy.unbound() :
+      impl = new KeyboardServiceProxyImpl.unbound() {
+    ptr = new _KeyboardServiceProxyCalls(impl);
+  }
+
+  factory KeyboardServiceProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    KeyboardServiceProxy p = new KeyboardServiceProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static KeyboardServiceProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For KeyboardServiceProxy"));
+    return new KeyboardServiceProxy.fromEndpoint(endpoint);
+  }
+
+  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 "KeyboardServiceProxy($impl)";
+  }
+}
+
+
+class KeyboardServiceStub extends bindings.Stub {
+  KeyboardService _impl = null;
+
+  KeyboardServiceStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  KeyboardServiceStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  KeyboardServiceStub.unbound() : super.unbound();
+
+  static KeyboardServiceStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For KeyboardServiceStub"));
+    return new KeyboardServiceStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = KeyboardServiceName;
+
+
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      case kKeyboardService_show_name:
+        var params = KeyboardServiceShowParams.deserialize(
+            message.payload);
+        _impl.show(params.client, params.type);
+        break;
+      case kKeyboardService_showByRequest_name:
+        var params = KeyboardServiceShowByRequestParams.deserialize(
+            message.payload);
+        _impl.showByRequest();
+        break;
+      case kKeyboardService_hide_name:
+        var params = KeyboardServiceHideParams.deserialize(
+            message.payload);
+        _impl.hide();
+        break;
+      case kKeyboardService_setText_name:
+        var params = KeyboardServiceSetTextParams.deserialize(
+            message.payload);
+        _impl.setText(params.text);
+        break;
+      case kKeyboardService_setSelection_name:
+        var params = KeyboardServiceSetSelectionParams.deserialize(
+            message.payload);
+        _impl.setSelection(params.start, params.end);
+        break;
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  KeyboardService get impl => _impl;
+  set impl(KeyboardService d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "KeyboardServiceStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/animations.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/animations.mojom.dart
new file mode 100644
index 0000000..7ae0808
--- /dev/null
+++ b/mojo/dart/packages/mojo_services/lib/mojo/animations.mojom.dart
@@ -0,0 +1,509 @@
+// 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.
+
+library animations_mojom;
+
+import 'dart:async';
+
+import 'package:mojo/bindings.dart' as bindings;
+import 'package:mojo/core.dart' as core;
+import 'package:mojo_services/mojo/geometry.mojom.dart' as geometry_mojom;
+class AnimationTweenType extends bindings.MojoEnum {
+  static const LINEAR = const AnimationTweenType._(0);
+  static const EASE_IN = const AnimationTweenType._(1);
+  static const EASE_OUT = const AnimationTweenType._(2);
+  static const EASE_IN_OUT = const AnimationTweenType._(3);
+
+  const AnimationTweenType._(int v) : super(v);
+
+  static const Map<String, AnimationTweenType> valuesMap = const {
+    "LINEAR": LINEAR,
+    "EASE_IN": EASE_IN,
+    "EASE_OUT": EASE_OUT,
+    "EASE_IN_OUT": EASE_IN_OUT,
+  };
+  static const List<AnimationTweenType> values = const [
+    LINEAR,
+    EASE_IN,
+    EASE_OUT,
+    EASE_IN_OUT,
+  ];
+
+  static AnimationTweenType valueOf(String name) => valuesMap[name];
+
+  factory AnimationTweenType(int v) {
+    switch (v) {
+      case 0:
+        return LINEAR;
+      case 1:
+        return EASE_IN;
+      case 2:
+        return EASE_OUT;
+      case 3:
+        return EASE_IN_OUT;
+      default:
+        return null;
+    }
+  }
+
+  static AnimationTweenType decode(bindings.Decoder decoder0, int offset) {
+    int v = decoder0.decodeUint32(offset);
+    AnimationTweenType result = new AnimationTweenType(v);
+    if (result == null) {
+      throw new bindings.MojoCodecError(
+          'Bad value $v for enum AnimationTweenType.');
+    }
+    return result;
+  }
+
+  String toString() {
+    switch(this) {
+      case LINEAR:
+        return 'AnimationTweenType.LINEAR';
+      case EASE_IN:
+        return 'AnimationTweenType.EASE_IN';
+      case EASE_OUT:
+        return 'AnimationTweenType.EASE_OUT';
+      case EASE_IN_OUT:
+        return 'AnimationTweenType.EASE_IN_OUT';
+    }
+  }
+
+  int toJson() => value;
+}
+class AnimationProperty extends bindings.MojoEnum {
+  static const NONE = const AnimationProperty._(0);
+  static const OPACITY = const AnimationProperty._(1);
+  static const TRANSFORM = const AnimationProperty._(2);
+
+  const AnimationProperty._(int v) : super(v);
+
+  static const Map<String, AnimationProperty> valuesMap = const {
+    "NONE": NONE,
+    "OPACITY": OPACITY,
+    "TRANSFORM": TRANSFORM,
+  };
+  static const List<AnimationProperty> values = const [
+    NONE,
+    OPACITY,
+    TRANSFORM,
+  ];
+
+  static AnimationProperty valueOf(String name) => valuesMap[name];
+
+  factory AnimationProperty(int v) {
+    switch (v) {
+      case 0:
+        return NONE;
+      case 1:
+        return OPACITY;
+      case 2:
+        return TRANSFORM;
+      default:
+        return null;
+    }
+  }
+
+  static AnimationProperty decode(bindings.Decoder decoder0, int offset) {
+    int v = decoder0.decodeUint32(offset);
+    AnimationProperty result = new AnimationProperty(v);
+    if (result == null) {
+      throw new bindings.MojoCodecError(
+          'Bad value $v for enum AnimationProperty.');
+    }
+    return result;
+  }
+
+  String toString() {
+    switch(this) {
+      case NONE:
+        return 'AnimationProperty.NONE';
+      case OPACITY:
+        return 'AnimationProperty.OPACITY';
+      case TRANSFORM:
+        return 'AnimationProperty.TRANSFORM';
+    }
+  }
+
+  int toJson() => value;
+}
+
+
+
+class AnimationValue extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  double floatValue = 0.0;
+  geometry_mojom.Transform transform = null;
+
+  AnimationValue() : super(kVersions.last.size);
+
+  static AnimationValue deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static AnimationValue decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    AnimationValue result = new AnimationValue();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.floatValue = decoder0.decodeFloat(8);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(16, false);
+      result.transform = geometry_mojom.Transform.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeFloat(floatValue, 8);
+    
+    encoder0.encodeStruct(transform, 16, false);
+  }
+
+  String toString() {
+    return "AnimationValue("
+           "floatValue: $floatValue" ", "
+           "transform: $transform" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["floatValue"] = floatValue;
+    map["transform"] = transform;
+    return map;
+  }
+}
+
+
+class AnimationElement extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(40, 0)
+  ];
+  AnimationProperty property = null;
+  AnimationTweenType tweenType = null;
+  int duration = 0;
+  AnimationValue startValue = null;
+  AnimationValue targetValue = null;
+
+  AnimationElement() : super(kVersions.last.size);
+
+  static AnimationElement deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static AnimationElement decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    AnimationElement result = new AnimationElement();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+        result.property = AnimationProperty.decode(decoder0, 8);
+        if (result.property == null) {
+          throw new bindings.MojoCodecError(
+            'Trying to decode null union for non-nullable AnimationProperty.');
+        }
+    }
+    if (mainDataHeader.version >= 0) {
+      
+        result.tweenType = AnimationTweenType.decode(decoder0, 12);
+        if (result.tweenType == null) {
+          throw new bindings.MojoCodecError(
+            'Trying to decode null union for non-nullable AnimationTweenType.');
+        }
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.duration = decoder0.decodeInt64(16);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(24, true);
+      result.startValue = AnimationValue.decode(decoder1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(32, true);
+      result.targetValue = AnimationValue.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeEnum(property, 8);
+    
+    encoder0.encodeEnum(tweenType, 12);
+    
+    encoder0.encodeInt64(duration, 16);
+    
+    encoder0.encodeStruct(startValue, 24, true);
+    
+    encoder0.encodeStruct(targetValue, 32, true);
+  }
+
+  String toString() {
+    return "AnimationElement("
+           "property: $property" ", "
+           "tweenType: $tweenType" ", "
+           "duration: $duration" ", "
+           "startValue: $startValue" ", "
+           "targetValue: $targetValue" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["property"] = property;
+    map["tweenType"] = tweenType;
+    map["duration"] = duration;
+    map["startValue"] = startValue;
+    map["targetValue"] = targetValue;
+    return map;
+  }
+}
+
+
+class AnimationSequence extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  int cycleCount = 0;
+  List<AnimationElement> elements = null;
+
+  AnimationSequence() : super(kVersions.last.size);
+
+  static AnimationSequence deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static AnimationSequence decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    AnimationSequence result = new AnimationSequence();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.cycleCount = decoder0.decodeUint32(8);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(16, false);
+      {
+        var si1 = decoder1.decodeDataHeaderForPointerArray(bindings.kUnspecifiedArrayLength);
+        result.elements = new List<AnimationElement>(si1.numElements);
+        for (int i1 = 0; i1 < si1.numElements; ++i1) {
+          
+          var decoder2 = decoder1.decodePointer(bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i1, false);
+          result.elements[i1] = AnimationElement.decode(decoder2);
+        }
+      }
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeUint32(cycleCount, 8);
+    
+    if (elements == null) {
+      encoder0.encodeNullPointer(16, false);
+    } else {
+      var encoder1 = encoder0.encodePointerArray(elements.length, 16, bindings.kUnspecifiedArrayLength);
+      for (int i0 = 0; i0 < elements.length; ++i0) {
+        
+        encoder1.encodeStruct(elements[i0], bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i0, false);
+      }
+    }
+  }
+
+  String toString() {
+    return "AnimationSequence("
+           "cycleCount: $cycleCount" ", "
+           "elements: $elements" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["cycleCount"] = cycleCount;
+    map["elements"] = elements;
+    return map;
+  }
+}
+
+
+class AnimationGroup extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  int viewId = 0;
+  List<AnimationSequence> sequences = null;
+
+  AnimationGroup() : super(kVersions.last.size);
+
+  static AnimationGroup deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static AnimationGroup decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    AnimationGroup result = new AnimationGroup();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.viewId = decoder0.decodeUint32(8);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(16, false);
+      {
+        var si1 = decoder1.decodeDataHeaderForPointerArray(bindings.kUnspecifiedArrayLength);
+        result.sequences = new List<AnimationSequence>(si1.numElements);
+        for (int i1 = 0; i1 < si1.numElements; ++i1) {
+          
+          var decoder2 = decoder1.decodePointer(bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i1, false);
+          result.sequences[i1] = AnimationSequence.decode(decoder2);
+        }
+      }
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeUint32(viewId, 8);
+    
+    if (sequences == null) {
+      encoder0.encodeNullPointer(16, false);
+    } else {
+      var encoder1 = encoder0.encodePointerArray(sequences.length, 16, bindings.kUnspecifiedArrayLength);
+      for (int i0 = 0; i0 < sequences.length; ++i0) {
+        
+        encoder1.encodeStruct(sequences[i0], bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i0, false);
+      }
+    }
+  }
+
+  String toString() {
+    return "AnimationGroup("
+           "viewId: $viewId" ", "
+           "sequences: $sequences" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["viewId"] = viewId;
+    map["sequences"] = sequences;
+    return map;
+  }
+}
+
+
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
new file mode 100644
index 0000000..0a62c2d
--- /dev/null
+++ b/mojo/dart/packages/mojo_services/lib/mojo/asset_bundle/asset_bundle.mojom.dart
@@ -0,0 +1,612 @@
+// 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.
+
+library asset_bundle_mojom;
+
+import 'dart:async';
+
+import 'package:mojo/bindings.dart' as bindings;
+import 'package:mojo/core.dart' as core;
+
+
+
+class AssetBundleGetAsStreamParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  String assetName = null;
+
+  AssetBundleGetAsStreamParams() : super(kVersions.last.size);
+
+  static AssetBundleGetAsStreamParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static AssetBundleGetAsStreamParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    AssetBundleGetAsStreamParams result = new AssetBundleGetAsStreamParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.assetName = decoder0.decodeString(8, false);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeString(assetName, 8, false);
+  }
+
+  String toString() {
+    return "AssetBundleGetAsStreamParams("
+           "assetName: $assetName" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["assetName"] = assetName;
+    return map;
+  }
+}
+
+
+class AssetBundleGetAsStreamResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  core.MojoDataPipeConsumer assetData = null;
+
+  AssetBundleGetAsStreamResponseParams() : super(kVersions.last.size);
+
+  static AssetBundleGetAsStreamResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static AssetBundleGetAsStreamResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    AssetBundleGetAsStreamResponseParams result = new AssetBundleGetAsStreamResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.assetData = decoder0.decodeConsumerHandle(8, false);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeConsumerHandle(assetData, 8, false);
+  }
+
+  String toString() {
+    return "AssetBundleGetAsStreamResponseParams("
+           "assetData: $assetData" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+
+class AssetUnpackerUnpackZipStreamParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  core.MojoDataPipeConsumer zippedAssets = null;
+  Object assetBundle = null;
+
+  AssetUnpackerUnpackZipStreamParams() : super(kVersions.last.size);
+
+  static AssetUnpackerUnpackZipStreamParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static AssetUnpackerUnpackZipStreamParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    AssetUnpackerUnpackZipStreamParams result = new AssetUnpackerUnpackZipStreamParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.zippedAssets = decoder0.decodeConsumerHandle(8, false);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.assetBundle = decoder0.decodeInterfaceRequest(12, false, AssetBundleStub.newFromEndpoint);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeConsumerHandle(zippedAssets, 8, false);
+    
+    encoder0.encodeInterfaceRequest(assetBundle, 12, false);
+  }
+
+  String toString() {
+    return "AssetUnpackerUnpackZipStreamParams("
+           "zippedAssets: $zippedAssets" ", "
+           "assetBundle: $assetBundle" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+const int kAssetBundle_getAsStream_name = 0;
+
+const String AssetBundleName =
+      'mojo::asset_bundle::AssetBundle';
+
+abstract class AssetBundle {
+  dynamic getAsStream(String assetName,[Function responseFactory = null]);
+
+}
+
+
+class AssetBundleProxyImpl extends bindings.Proxy {
+  AssetBundleProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  AssetBundleProxyImpl.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);
+  }
+
+  String get name => AssetBundleName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      case kAssetBundle_getAsStream_name:
+        var r = AssetBundleGetAsStreamResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "AssetBundleProxyImpl($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,
+          kAssetBundle_getAsStream_name,
+          -1,
+          bindings.MessageHeader.kMessageExpectsResponse);
+    }
+}
+
+
+class AssetBundleProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  AssetBundle ptr;
+  final String name = AssetBundleName;
+
+  AssetBundleProxy(AssetBundleProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _AssetBundleProxyCalls(proxyImpl);
+
+  AssetBundleProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new AssetBundleProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _AssetBundleProxyCalls(impl);
+  }
+
+  AssetBundleProxy.fromHandle(core.MojoHandle handle) :
+      impl = new AssetBundleProxyImpl.fromHandle(handle) {
+    ptr = new _AssetBundleProxyCalls(impl);
+  }
+
+  AssetBundleProxy.unbound() :
+      impl = new AssetBundleProxyImpl.unbound() {
+    ptr = new _AssetBundleProxyCalls(impl);
+  }
+
+  factory AssetBundleProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    AssetBundleProxy p = new AssetBundleProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static AssetBundleProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For AssetBundleProxy"));
+    return new AssetBundleProxy.fromEndpoint(endpoint);
+  }
+
+  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)";
+  }
+}
+
+
+class AssetBundleStub extends bindings.Stub {
+  AssetBundle _impl = null;
+
+  AssetBundleStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  AssetBundleStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  AssetBundleStub.unbound() : super.unbound();
+
+  static AssetBundleStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For AssetBundleStub"));
+    return new AssetBundleStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = AssetBundleName;
+
+
+  AssetBundleGetAsStreamResponseParams _AssetBundleGetAsStreamResponseParamsFactory(core.MojoDataPipeConsumer assetData) {
+    var result = new AssetBundleGetAsStreamResponseParams();
+    result.assetData = assetData;
+    return result;
+  }
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      case kAssetBundle_getAsStream_name:
+        var params = AssetBundleGetAsStreamParams.deserialize(
+            message.payload);
+        var response = _impl.getAsStream(params.assetName,_AssetBundleGetAsStreamResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kAssetBundle_getAsStream_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kAssetBundle_getAsStream_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  AssetBundle get impl => _impl;
+  set impl(AssetBundle d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "AssetBundleStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+const int kAssetUnpacker_unpackZipStream_name = 0;
+
+const String AssetUnpackerName =
+      'mojo::asset_bundle::AssetUnpacker';
+
+abstract class AssetUnpacker {
+  void unpackZipStream(core.MojoDataPipeConsumer zippedAssets, Object assetBundle);
+
+}
+
+
+class AssetUnpackerProxyImpl extends bindings.Proxy {
+  AssetUnpackerProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  AssetUnpackerProxyImpl.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);
+  }
+
+  String get name => AssetUnpackerName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "AssetUnpackerProxyImpl($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, kAssetUnpacker_unpackZipStream_name);
+    }
+  
+}
+
+
+class AssetUnpackerProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  AssetUnpacker ptr;
+  final String name = AssetUnpackerName;
+
+  AssetUnpackerProxy(AssetUnpackerProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _AssetUnpackerProxyCalls(proxyImpl);
+
+  AssetUnpackerProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new AssetUnpackerProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _AssetUnpackerProxyCalls(impl);
+  }
+
+  AssetUnpackerProxy.fromHandle(core.MojoHandle handle) :
+      impl = new AssetUnpackerProxyImpl.fromHandle(handle) {
+    ptr = new _AssetUnpackerProxyCalls(impl);
+  }
+
+  AssetUnpackerProxy.unbound() :
+      impl = new AssetUnpackerProxyImpl.unbound() {
+    ptr = new _AssetUnpackerProxyCalls(impl);
+  }
+
+  factory AssetUnpackerProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    AssetUnpackerProxy p = new AssetUnpackerProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static AssetUnpackerProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For AssetUnpackerProxy"));
+    return new AssetUnpackerProxy.fromEndpoint(endpoint);
+  }
+
+  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)";
+  }
+}
+
+
+class AssetUnpackerStub extends bindings.Stub {
+  AssetUnpacker _impl = null;
+
+  AssetUnpackerStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  AssetUnpackerStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  AssetUnpackerStub.unbound() : super.unbound();
+
+  static AssetUnpackerStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For AssetUnpackerStub"));
+    return new AssetUnpackerStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = AssetUnpackerName;
+
+
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      case kAssetUnpacker_unpackZipStream_name:
+        var params = AssetUnpackerUnpackZipStreamParams.deserialize(
+            message.payload);
+        _impl.unpackZipStream(params.zippedAssets, params.assetBundle);
+        break;
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  AssetUnpacker get impl => _impl;
+  set impl(AssetUnpacker d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "AssetUnpackerStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+
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
new file mode 100644
index 0000000..167a6f5
--- /dev/null
+++ b/mojo/dart/packages/mojo_services/lib/mojo/authenticating_url_loader_interceptor_meta_factory.mojom.dart
@@ -0,0 +1,265 @@
+// 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.
+
+library authenticating_url_loader_interceptor_meta_factory_mojom;
+
+import 'dart:async';
+
+import 'package:mojo/bindings.dart' as bindings;
+import 'package:mojo/core.dart' as core;
+import 'package:mojo_services/authentication/authentication.mojom.dart' as authentication_mojom;
+import 'package:mojo_services/mojo/url_loader_interceptor.mojom.dart' as url_loader_interceptor_mojom;
+
+
+
+class AuthenticatingUrlLoaderInterceptorMetaFactoryCreateUrlLoaderInterceptorFactoryParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  Object factoryRequest = null;
+  Object authenticationService = null;
+
+  AuthenticatingUrlLoaderInterceptorMetaFactoryCreateUrlLoaderInterceptorFactoryParams() : super(kVersions.last.size);
+
+  static AuthenticatingUrlLoaderInterceptorMetaFactoryCreateUrlLoaderInterceptorFactoryParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static AuthenticatingUrlLoaderInterceptorMetaFactoryCreateUrlLoaderInterceptorFactoryParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    AuthenticatingUrlLoaderInterceptorMetaFactoryCreateUrlLoaderInterceptorFactoryParams result = new AuthenticatingUrlLoaderInterceptorMetaFactoryCreateUrlLoaderInterceptorFactoryParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.factoryRequest = decoder0.decodeInterfaceRequest(8, false, url_loader_interceptor_mojom.UrlLoaderInterceptorFactoryStub.newFromEndpoint);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.authenticationService = decoder0.decodeServiceInterface(12, false, authentication_mojom.AuthenticationServiceProxy.newFromEndpoint);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeInterfaceRequest(factoryRequest, 8, false);
+    
+    encoder0.encodeInterface(authenticationService, 12, false);
+  }
+
+  String toString() {
+    return "AuthenticatingUrlLoaderInterceptorMetaFactoryCreateUrlLoaderInterceptorFactoryParams("
+           "factoryRequest: $factoryRequest" ", "
+           "authenticationService: $authenticationService" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+const int kAuthenticatingUrlLoaderInterceptorMetaFactory_createUrlLoaderInterceptorFactory_name = 0;
+
+const String AuthenticatingUrlLoaderInterceptorMetaFactoryName =
+      'mojo::AuthenticatingURLLoaderInterceptorMetaFactory';
+
+abstract class AuthenticatingUrlLoaderInterceptorMetaFactory {
+  void createUrlLoaderInterceptorFactory(Object factoryRequest, Object authenticationService);
+
+}
+
+
+class AuthenticatingUrlLoaderInterceptorMetaFactoryProxyImpl extends bindings.Proxy {
+  AuthenticatingUrlLoaderInterceptorMetaFactoryProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  AuthenticatingUrlLoaderInterceptorMetaFactoryProxyImpl.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);
+  }
+
+  String get name => AuthenticatingUrlLoaderInterceptorMetaFactoryName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "AuthenticatingUrlLoaderInterceptorMetaFactoryProxyImpl($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, kAuthenticatingUrlLoaderInterceptorMetaFactory_createUrlLoaderInterceptorFactory_name);
+    }
+  
+}
+
+
+class AuthenticatingUrlLoaderInterceptorMetaFactoryProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  AuthenticatingUrlLoaderInterceptorMetaFactory ptr;
+  final String name = AuthenticatingUrlLoaderInterceptorMetaFactoryName;
+
+  AuthenticatingUrlLoaderInterceptorMetaFactoryProxy(AuthenticatingUrlLoaderInterceptorMetaFactoryProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _AuthenticatingUrlLoaderInterceptorMetaFactoryProxyCalls(proxyImpl);
+
+  AuthenticatingUrlLoaderInterceptorMetaFactoryProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new AuthenticatingUrlLoaderInterceptorMetaFactoryProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _AuthenticatingUrlLoaderInterceptorMetaFactoryProxyCalls(impl);
+  }
+
+  AuthenticatingUrlLoaderInterceptorMetaFactoryProxy.fromHandle(core.MojoHandle handle) :
+      impl = new AuthenticatingUrlLoaderInterceptorMetaFactoryProxyImpl.fromHandle(handle) {
+    ptr = new _AuthenticatingUrlLoaderInterceptorMetaFactoryProxyCalls(impl);
+  }
+
+  AuthenticatingUrlLoaderInterceptorMetaFactoryProxy.unbound() :
+      impl = new AuthenticatingUrlLoaderInterceptorMetaFactoryProxyImpl.unbound() {
+    ptr = new _AuthenticatingUrlLoaderInterceptorMetaFactoryProxyCalls(impl);
+  }
+
+  factory AuthenticatingUrlLoaderInterceptorMetaFactoryProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    AuthenticatingUrlLoaderInterceptorMetaFactoryProxy p = new AuthenticatingUrlLoaderInterceptorMetaFactoryProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static AuthenticatingUrlLoaderInterceptorMetaFactoryProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For AuthenticatingUrlLoaderInterceptorMetaFactoryProxy"));
+    return new AuthenticatingUrlLoaderInterceptorMetaFactoryProxy.fromEndpoint(endpoint);
+  }
+
+  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)";
+  }
+}
+
+
+class AuthenticatingUrlLoaderInterceptorMetaFactoryStub extends bindings.Stub {
+  AuthenticatingUrlLoaderInterceptorMetaFactory _impl = null;
+
+  AuthenticatingUrlLoaderInterceptorMetaFactoryStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  AuthenticatingUrlLoaderInterceptorMetaFactoryStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  AuthenticatingUrlLoaderInterceptorMetaFactoryStub.unbound() : super.unbound();
+
+  static AuthenticatingUrlLoaderInterceptorMetaFactoryStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For AuthenticatingUrlLoaderInterceptorMetaFactoryStub"));
+    return new AuthenticatingUrlLoaderInterceptorMetaFactoryStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = AuthenticatingUrlLoaderInterceptorMetaFactoryName;
+
+
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      case kAuthenticatingUrlLoaderInterceptorMetaFactory_createUrlLoaderInterceptorFactory_name:
+        var params = AuthenticatingUrlLoaderInterceptorMetaFactoryCreateUrlLoaderInterceptorFactoryParams.deserialize(
+            message.payload);
+        _impl.createUrlLoaderInterceptorFactory(params.factoryRequest, params.authenticationService);
+        break;
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  AuthenticatingUrlLoaderInterceptorMetaFactory get impl => _impl;
+  set impl(AuthenticatingUrlLoaderInterceptorMetaFactory d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "AuthenticatingUrlLoaderInterceptorMetaFactoryStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/camera.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/camera.mojom.dart
new file mode 100644
index 0000000..1f7b328
--- /dev/null
+++ b/mojo/dart/packages/mojo_services/lib/mojo/camera.mojom.dart
@@ -0,0 +1,1032 @@
+// 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.
+
+library camera_mojom;
+
+import 'dart:async';
+
+import 'package:mojo/bindings.dart' as bindings;
+import 'package:mojo/core.dart' as core;
+
+
+
+class Photo extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  String uniqueId = null;
+  core.MojoDataPipeConsumer content = null;
+
+  Photo() : super(kVersions.last.size);
+
+  static Photo deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static Photo decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    Photo result = new Photo();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.uniqueId = decoder0.decodeString(8, false);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.content = decoder0.decodeConsumerHandle(16, false);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeString(uniqueId, 8, false);
+    
+    encoder0.encodeConsumerHandle(content, 16, false);
+  }
+
+  String toString() {
+    return "Photo("
+           "uniqueId: $uniqueId" ", "
+           "content: $content" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+
+class CameraRollServiceUpdateParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(8, 0)
+  ];
+
+  CameraRollServiceUpdateParams() : super(kVersions.last.size);
+
+  static CameraRollServiceUpdateParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static CameraRollServiceUpdateParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    CameraRollServiceUpdateParams result = new CameraRollServiceUpdateParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    encoder.getStructEncoderAtOffset(kVersions.last);
+  }
+
+  String toString() {
+    return "CameraRollServiceUpdateParams("")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    return map;
+  }
+}
+
+
+class CameraRollServiceGetCountParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(8, 0)
+  ];
+
+  CameraRollServiceGetCountParams() : super(kVersions.last.size);
+
+  static CameraRollServiceGetCountParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static CameraRollServiceGetCountParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    CameraRollServiceGetCountParams result = new CameraRollServiceGetCountParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    encoder.getStructEncoderAtOffset(kVersions.last);
+  }
+
+  String toString() {
+    return "CameraRollServiceGetCountParams("")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    return map;
+  }
+}
+
+
+class CameraRollServiceGetCountResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  int numPhotos = 0;
+
+  CameraRollServiceGetCountResponseParams() : super(kVersions.last.size);
+
+  static CameraRollServiceGetCountResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static CameraRollServiceGetCountResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    CameraRollServiceGetCountResponseParams result = new CameraRollServiceGetCountResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.numPhotos = decoder0.decodeUint32(8);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeUint32(numPhotos, 8);
+  }
+
+  String toString() {
+    return "CameraRollServiceGetCountResponseParams("
+           "numPhotos: $numPhotos" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["numPhotos"] = numPhotos;
+    return map;
+  }
+}
+
+
+class CameraRollServiceGetPhotoParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  int index = 0;
+
+  CameraRollServiceGetPhotoParams() : super(kVersions.last.size);
+
+  static CameraRollServiceGetPhotoParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static CameraRollServiceGetPhotoParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    CameraRollServiceGetPhotoParams result = new CameraRollServiceGetPhotoParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.index = decoder0.decodeUint32(8);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeUint32(index, 8);
+  }
+
+  String toString() {
+    return "CameraRollServiceGetPhotoParams("
+           "index: $index" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["index"] = index;
+    return map;
+  }
+}
+
+
+class CameraRollServiceGetPhotoResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  Photo photo = null;
+
+  CameraRollServiceGetPhotoResponseParams() : super(kVersions.last.size);
+
+  static CameraRollServiceGetPhotoResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static CameraRollServiceGetPhotoResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    CameraRollServiceGetPhotoResponseParams result = new CameraRollServiceGetPhotoResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, true);
+      result.photo = Photo.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(photo, 8, true);
+  }
+
+  String toString() {
+    return "CameraRollServiceGetPhotoResponseParams("
+           "photo: $photo" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+
+class CameraServiceGetLatestFrameParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(8, 0)
+  ];
+
+  CameraServiceGetLatestFrameParams() : super(kVersions.last.size);
+
+  static CameraServiceGetLatestFrameParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static CameraServiceGetLatestFrameParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    CameraServiceGetLatestFrameParams result = new CameraServiceGetLatestFrameParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    encoder.getStructEncoderAtOffset(kVersions.last);
+  }
+
+  String toString() {
+    return "CameraServiceGetLatestFrameParams("")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    return map;
+  }
+}
+
+
+class CameraServiceGetLatestFrameResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  core.MojoDataPipeConsumer content = null;
+
+  CameraServiceGetLatestFrameResponseParams() : super(kVersions.last.size);
+
+  static CameraServiceGetLatestFrameResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static CameraServiceGetLatestFrameResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    CameraServiceGetLatestFrameResponseParams result = new CameraServiceGetLatestFrameResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.content = decoder0.decodeConsumerHandle(8, true);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeConsumerHandle(content, 8, true);
+  }
+
+  String toString() {
+    return "CameraServiceGetLatestFrameResponseParams("
+           "content: $content" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+const int kCameraRollService_update_name = 0;
+const int kCameraRollService_getCount_name = 1;
+const int kCameraRollService_getPhoto_name = 2;
+
+const String CameraRollServiceName =
+      'mojo::CameraRollService';
+
+abstract class CameraRollService {
+  void update();
+  dynamic getCount([Function responseFactory = null]);
+  dynamic getPhoto(int index,[Function responseFactory = null]);
+
+}
+
+
+class CameraRollServiceProxyImpl extends bindings.Proxy {
+  CameraRollServiceProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  CameraRollServiceProxyImpl.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);
+  }
+
+  String get name => CameraRollServiceName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      case kCameraRollService_getCount_name:
+        var r = CameraRollServiceGetCountResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      case kCameraRollService_getPhoto_name:
+        var r = CameraRollServiceGetPhotoResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "CameraRollServiceProxyImpl($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, kCameraRollService_update_name);
+    }
+  
+    dynamic getCount([Function responseFactory = null]) {
+      var params = new CameraRollServiceGetCountParams();
+      return _proxyImpl.sendMessageWithRequestId(
+          params,
+          kCameraRollService_getCount_name,
+          -1,
+          bindings.MessageHeader.kMessageExpectsResponse);
+    }
+    dynamic getPhoto(int index,[Function responseFactory = null]) {
+      var params = new CameraRollServiceGetPhotoParams();
+      params.index = index;
+      return _proxyImpl.sendMessageWithRequestId(
+          params,
+          kCameraRollService_getPhoto_name,
+          -1,
+          bindings.MessageHeader.kMessageExpectsResponse);
+    }
+}
+
+
+class CameraRollServiceProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  CameraRollService ptr;
+  final String name = CameraRollServiceName;
+
+  CameraRollServiceProxy(CameraRollServiceProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _CameraRollServiceProxyCalls(proxyImpl);
+
+  CameraRollServiceProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new CameraRollServiceProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _CameraRollServiceProxyCalls(impl);
+  }
+
+  CameraRollServiceProxy.fromHandle(core.MojoHandle handle) :
+      impl = new CameraRollServiceProxyImpl.fromHandle(handle) {
+    ptr = new _CameraRollServiceProxyCalls(impl);
+  }
+
+  CameraRollServiceProxy.unbound() :
+      impl = new CameraRollServiceProxyImpl.unbound() {
+    ptr = new _CameraRollServiceProxyCalls(impl);
+  }
+
+  factory CameraRollServiceProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    CameraRollServiceProxy p = new CameraRollServiceProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static CameraRollServiceProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For CameraRollServiceProxy"));
+    return new CameraRollServiceProxy.fromEndpoint(endpoint);
+  }
+
+  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 "CameraRollServiceProxy($impl)";
+  }
+}
+
+
+class CameraRollServiceStub extends bindings.Stub {
+  CameraRollService _impl = null;
+
+  CameraRollServiceStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  CameraRollServiceStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  CameraRollServiceStub.unbound() : super.unbound();
+
+  static CameraRollServiceStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For CameraRollServiceStub"));
+    return new CameraRollServiceStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = CameraRollServiceName;
+
+
+  CameraRollServiceGetCountResponseParams _CameraRollServiceGetCountResponseParamsFactory(int numPhotos) {
+    var result = new CameraRollServiceGetCountResponseParams();
+    result.numPhotos = numPhotos;
+    return result;
+  }
+  CameraRollServiceGetPhotoResponseParams _CameraRollServiceGetPhotoResponseParamsFactory(Photo photo) {
+    var result = new CameraRollServiceGetPhotoResponseParams();
+    result.photo = photo;
+    return result;
+  }
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      case kCameraRollService_update_name:
+        var params = CameraRollServiceUpdateParams.deserialize(
+            message.payload);
+        _impl.update();
+        break;
+      case kCameraRollService_getCount_name:
+        var params = CameraRollServiceGetCountParams.deserialize(
+            message.payload);
+        var response = _impl.getCount(_CameraRollServiceGetCountResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kCameraRollService_getCount_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kCameraRollService_getCount_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      case kCameraRollService_getPhoto_name:
+        var params = CameraRollServiceGetPhotoParams.deserialize(
+            message.payload);
+        var response = _impl.getPhoto(params.index,_CameraRollServiceGetPhotoResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kCameraRollService_getPhoto_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kCameraRollService_getPhoto_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  CameraRollService get impl => _impl;
+  set impl(CameraRollService d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "CameraRollServiceStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+const int kCameraService_getLatestFrame_name = 0;
+
+const String CameraServiceName =
+      'mojo::CameraService';
+
+abstract class CameraService {
+  dynamic getLatestFrame([Function responseFactory = null]);
+
+}
+
+
+class CameraServiceProxyImpl extends bindings.Proxy {
+  CameraServiceProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  CameraServiceProxyImpl.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);
+  }
+
+  String get name => CameraServiceName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      case kCameraService_getLatestFrame_name:
+        var r = CameraServiceGetLatestFrameResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "CameraServiceProxyImpl($superString)";
+  }
+}
+
+
+class _CameraServiceProxyCalls implements CameraService {
+  CameraServiceProxyImpl _proxyImpl;
+
+  _CameraServiceProxyCalls(this._proxyImpl);
+    dynamic getLatestFrame([Function responseFactory = null]) {
+      var params = new CameraServiceGetLatestFrameParams();
+      return _proxyImpl.sendMessageWithRequestId(
+          params,
+          kCameraService_getLatestFrame_name,
+          -1,
+          bindings.MessageHeader.kMessageExpectsResponse);
+    }
+}
+
+
+class CameraServiceProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  CameraService ptr;
+  final String name = CameraServiceName;
+
+  CameraServiceProxy(CameraServiceProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _CameraServiceProxyCalls(proxyImpl);
+
+  CameraServiceProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new CameraServiceProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _CameraServiceProxyCalls(impl);
+  }
+
+  CameraServiceProxy.fromHandle(core.MojoHandle handle) :
+      impl = new CameraServiceProxyImpl.fromHandle(handle) {
+    ptr = new _CameraServiceProxyCalls(impl);
+  }
+
+  CameraServiceProxy.unbound() :
+      impl = new CameraServiceProxyImpl.unbound() {
+    ptr = new _CameraServiceProxyCalls(impl);
+  }
+
+  factory CameraServiceProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    CameraServiceProxy p = new CameraServiceProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static CameraServiceProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For CameraServiceProxy"));
+    return new CameraServiceProxy.fromEndpoint(endpoint);
+  }
+
+  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)";
+  }
+}
+
+
+class CameraServiceStub extends bindings.Stub {
+  CameraService _impl = null;
+
+  CameraServiceStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  CameraServiceStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  CameraServiceStub.unbound() : super.unbound();
+
+  static CameraServiceStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For CameraServiceStub"));
+    return new CameraServiceStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = CameraServiceName;
+
+
+  CameraServiceGetLatestFrameResponseParams _CameraServiceGetLatestFrameResponseParamsFactory(core.MojoDataPipeConsumer content) {
+    var result = new CameraServiceGetLatestFrameResponseParams();
+    result.content = content;
+    return result;
+  }
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      case kCameraService_getLatestFrame_name:
+        var params = CameraServiceGetLatestFrameParams.deserialize(
+            message.payload);
+        var response = _impl.getLatestFrame(_CameraServiceGetLatestFrameResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kCameraService_getLatestFrame_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kCameraService_getLatestFrame_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  CameraService get impl => _impl;
+  set impl(CameraService d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "CameraServiceStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/clipboard.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/clipboard.mojom.dart
new file mode 100644
index 0000000..c915407
--- /dev/null
+++ b/mojo/dart/packages/mojo_services/lib/mojo/clipboard.mojom.dart
@@ -0,0 +1,998 @@
+// 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.
+
+library clipboard_mojom;
+
+import 'dart:async';
+
+import 'package:mojo/bindings.dart' as bindings;
+import 'package:mojo/core.dart' as core;
+
+
+
+class ClipboardGetSequenceNumberParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  ClipboardType clipboardType = null;
+
+  ClipboardGetSequenceNumberParams() : super(kVersions.last.size);
+
+  static ClipboardGetSequenceNumberParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ClipboardGetSequenceNumberParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ClipboardGetSequenceNumberParams result = new ClipboardGetSequenceNumberParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+        result.clipboardType = ClipboardType.decode(decoder0, 8);
+        if (result.clipboardType == null) {
+          throw new bindings.MojoCodecError(
+            'Trying to decode null union for non-nullable ClipboardType.');
+        }
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeEnum(clipboardType, 8);
+  }
+
+  String toString() {
+    return "ClipboardGetSequenceNumberParams("
+           "clipboardType: $clipboardType" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["clipboardType"] = clipboardType;
+    return map;
+  }
+}
+
+
+class ClipboardGetSequenceNumberResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  int sequence = 0;
+
+  ClipboardGetSequenceNumberResponseParams() : super(kVersions.last.size);
+
+  static ClipboardGetSequenceNumberResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ClipboardGetSequenceNumberResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ClipboardGetSequenceNumberResponseParams result = new ClipboardGetSequenceNumberResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.sequence = decoder0.decodeUint64(8);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeUint64(sequence, 8);
+  }
+
+  String toString() {
+    return "ClipboardGetSequenceNumberResponseParams("
+           "sequence: $sequence" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["sequence"] = sequence;
+    return map;
+  }
+}
+
+
+class ClipboardGetAvailableMimeTypesParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  ClipboardType clipboardTypes = null;
+
+  ClipboardGetAvailableMimeTypesParams() : super(kVersions.last.size);
+
+  static ClipboardGetAvailableMimeTypesParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ClipboardGetAvailableMimeTypesParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ClipboardGetAvailableMimeTypesParams result = new ClipboardGetAvailableMimeTypesParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+        result.clipboardTypes = ClipboardType.decode(decoder0, 8);
+        if (result.clipboardTypes == null) {
+          throw new bindings.MojoCodecError(
+            'Trying to decode null union for non-nullable ClipboardType.');
+        }
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeEnum(clipboardTypes, 8);
+  }
+
+  String toString() {
+    return "ClipboardGetAvailableMimeTypesParams("
+           "clipboardTypes: $clipboardTypes" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["clipboardTypes"] = clipboardTypes;
+    return map;
+  }
+}
+
+
+class ClipboardGetAvailableMimeTypesResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  List<String> types = null;
+
+  ClipboardGetAvailableMimeTypesResponseParams() : super(kVersions.last.size);
+
+  static ClipboardGetAvailableMimeTypesResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ClipboardGetAvailableMimeTypesResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ClipboardGetAvailableMimeTypesResponseParams result = new ClipboardGetAvailableMimeTypesResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, false);
+      {
+        var si1 = decoder1.decodeDataHeaderForPointerArray(bindings.kUnspecifiedArrayLength);
+        result.types = new List<String>(si1.numElements);
+        for (int i1 = 0; i1 < si1.numElements; ++i1) {
+          
+          result.types[i1] = decoder1.decodeString(bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i1, false);
+        }
+      }
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    if (types == null) {
+      encoder0.encodeNullPointer(8, false);
+    } else {
+      var encoder1 = encoder0.encodePointerArray(types.length, 8, bindings.kUnspecifiedArrayLength);
+      for (int i0 = 0; i0 < types.length; ++i0) {
+        
+        encoder1.encodeString(types[i0], bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i0, false);
+      }
+    }
+  }
+
+  String toString() {
+    return "ClipboardGetAvailableMimeTypesResponseParams("
+           "types: $types" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["types"] = types;
+    return map;
+  }
+}
+
+
+class ClipboardReadMimeTypeParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  ClipboardType clipboardType = null;
+  String mimeType = null;
+
+  ClipboardReadMimeTypeParams() : super(kVersions.last.size);
+
+  static ClipboardReadMimeTypeParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ClipboardReadMimeTypeParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ClipboardReadMimeTypeParams result = new ClipboardReadMimeTypeParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+        result.clipboardType = ClipboardType.decode(decoder0, 8);
+        if (result.clipboardType == null) {
+          throw new bindings.MojoCodecError(
+            'Trying to decode null union for non-nullable ClipboardType.');
+        }
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.mimeType = decoder0.decodeString(16, false);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeEnum(clipboardType, 8);
+    
+    encoder0.encodeString(mimeType, 16, false);
+  }
+
+  String toString() {
+    return "ClipboardReadMimeTypeParams("
+           "clipboardType: $clipboardType" ", "
+           "mimeType: $mimeType" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["clipboardType"] = clipboardType;
+    map["mimeType"] = mimeType;
+    return map;
+  }
+}
+
+
+class ClipboardReadMimeTypeResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  List<int> data = null;
+
+  ClipboardReadMimeTypeResponseParams() : super(kVersions.last.size);
+
+  static ClipboardReadMimeTypeResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ClipboardReadMimeTypeResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ClipboardReadMimeTypeResponseParams result = new ClipboardReadMimeTypeResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.data = decoder0.decodeUint8Array(8, bindings.kArrayNullable, bindings.kUnspecifiedArrayLength);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeUint8Array(data, 8, bindings.kArrayNullable, bindings.kUnspecifiedArrayLength);
+  }
+
+  String toString() {
+    return "ClipboardReadMimeTypeResponseParams("
+           "data: $data" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["data"] = data;
+    return map;
+  }
+}
+
+
+class ClipboardWriteClipboardDataParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  ClipboardType clipboardType = null;
+  Map<String, List<int>> data = null;
+
+  ClipboardWriteClipboardDataParams() : super(kVersions.last.size);
+
+  static ClipboardWriteClipboardDataParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ClipboardWriteClipboardDataParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ClipboardWriteClipboardDataParams result = new ClipboardWriteClipboardDataParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+        result.clipboardType = ClipboardType.decode(decoder0, 8);
+        if (result.clipboardType == null) {
+          throw new bindings.MojoCodecError(
+            'Trying to decode null union for non-nullable ClipboardType.');
+        }
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(16, true);
+      if (decoder1 == null) {
+        result.data = null;
+      } else {
+        decoder1.decodeDataHeaderForMap();
+        List<String> keys0;
+        List<List<int>> values0;
+        {
+          
+          var decoder2 = decoder1.decodePointer(bindings.ArrayDataHeader.kHeaderSize, false);
+          {
+            var si2 = decoder2.decodeDataHeaderForPointerArray(bindings.kUnspecifiedArrayLength);
+            keys0 = new List<String>(si2.numElements);
+            for (int i2 = 0; i2 < si2.numElements; ++i2) {
+              
+              keys0[i2] = decoder2.decodeString(bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i2, false);
+            }
+          }
+        }
+        {
+          
+          var decoder2 = decoder1.decodePointer(bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize, false);
+          {
+            var si2 = decoder2.decodeDataHeaderForPointerArray(keys0.length);
+            values0 = new List<List<int>>(si2.numElements);
+            for (int i2 = 0; i2 < si2.numElements; ++i2) {
+              
+              values0[i2] = decoder2.decodeUint8Array(bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i2, bindings.kNothingNullable, bindings.kUnspecifiedArrayLength);
+            }
+          }
+        }
+        result.data = new Map<String, List<int>>.fromIterables(
+            keys0, values0);
+      }
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeEnum(clipboardType, 8);
+    
+    if (data == null) {
+      encoder0.encodeNullPointer(16, true);
+    } else {
+      var encoder1 = encoder0.encoderForMap(16);
+      int size0 = data.length;
+      var keys0 = data.keys.toList();
+      var values0 = data.values.toList();
+      
+      {
+        var encoder2 = encoder1.encodePointerArray(keys0.length, bindings.ArrayDataHeader.kHeaderSize, bindings.kUnspecifiedArrayLength);
+        for (int i1 = 0; i1 < keys0.length; ++i1) {
+          
+          encoder2.encodeString(keys0[i1], bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i1, false);
+        }
+      }
+      
+      {
+        var encoder2 = encoder1.encodePointerArray(values0.length, bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize, bindings.kUnspecifiedArrayLength);
+        for (int i1 = 0; i1 < values0.length; ++i1) {
+          
+          encoder2.encodeUint8Array(values0[i1], bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i1, bindings.kNothingNullable, bindings.kUnspecifiedArrayLength);
+        }
+      }
+    }
+  }
+
+  String toString() {
+    return "ClipboardWriteClipboardDataParams("
+           "clipboardType: $clipboardType" ", "
+           "data: $data" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["clipboardType"] = clipboardType;
+    map["data"] = data;
+    return map;
+  }
+}
+
+const int kClipboard_getSequenceNumber_name = 0;
+const int kClipboard_getAvailableMimeTypes_name = 1;
+const int kClipboard_readMimeType_name = 2;
+const int kClipboard_writeClipboardData_name = 3;
+
+const String ClipboardName =
+      'mojo::Clipboard';
+  class ClipboardType extends bindings.MojoEnum {
+  static const COPY_PASTE = const ClipboardType._(0);
+  static const SELECTION = const ClipboardType._(1);
+  static const DRAG = const ClipboardType._(2);
+
+  const ClipboardType._(int v) : super(v);
+
+  static const Map<String, ClipboardType> valuesMap = const {
+    "COPY_PASTE": COPY_PASTE,
+    "SELECTION": SELECTION,
+    "DRAG": DRAG,
+  };
+  static const List<ClipboardType> values = const [
+    COPY_PASTE,
+    SELECTION,
+    DRAG,
+  ];
+
+  static ClipboardType valueOf(String name) => valuesMap[name];
+
+  factory ClipboardType(int v) {
+    switch (v) {
+      case 0:
+        return COPY_PASTE;
+      case 1:
+        return SELECTION;
+      case 2:
+        return DRAG;
+      default:
+        return null;
+    }
+  }
+
+  static ClipboardType decode(bindings.Decoder decoder0, int offset) {
+    int v = decoder0.decodeUint32(offset);
+    ClipboardType result = new ClipboardType(v);
+    if (result == null) {
+      throw new bindings.MojoCodecError(
+          'Bad value $v for enum ClipboardType.');
+    }
+    return result;
+  }
+
+  String toString() {
+    switch(this) {
+      case COPY_PASTE:
+        return 'ClipboardType.COPY_PASTE';
+      case SELECTION:
+        return 'ClipboardType.SELECTION';
+      case DRAG:
+        return 'ClipboardType.DRAG';
+    }
+  }
+
+  int toJson() => value;
+}
+
+abstract class Clipboard {
+  dynamic getSequenceNumber(ClipboardType clipboardType,[Function responseFactory = null]);
+  dynamic getAvailableMimeTypes(ClipboardType clipboardTypes,[Function responseFactory = null]);
+  dynamic readMimeType(ClipboardType clipboardType,String mimeType,[Function responseFactory = null]);
+  void writeClipboardData(ClipboardType clipboardType, Map<String, List<int>> data);
+
+  static const MIME_TYPE_TEXT = "text/plain";
+  static const MIME_TYPE_HTML = "text/html";
+  static const MIME_TYPE_URL = "text/url";
+}
+
+
+class ClipboardProxyImpl extends bindings.Proxy {
+  ClipboardProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  ClipboardProxyImpl.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);
+  }
+
+  String get name => ClipboardName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      case kClipboard_getSequenceNumber_name:
+        var r = ClipboardGetSequenceNumberResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      case kClipboard_getAvailableMimeTypes_name:
+        var r = ClipboardGetAvailableMimeTypesResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      case kClipboard_readMimeType_name:
+        var r = ClipboardReadMimeTypeResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "ClipboardProxyImpl($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,
+          kClipboard_getSequenceNumber_name,
+          -1,
+          bindings.MessageHeader.kMessageExpectsResponse);
+    }
+    dynamic getAvailableMimeTypes(ClipboardType clipboardTypes,[Function responseFactory = null]) {
+      var params = new ClipboardGetAvailableMimeTypesParams();
+      params.clipboardTypes = clipboardTypes;
+      return _proxyImpl.sendMessageWithRequestId(
+          params,
+          kClipboard_getAvailableMimeTypes_name,
+          -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,
+          kClipboard_readMimeType_name,
+          -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, kClipboard_writeClipboardData_name);
+    }
+  
+}
+
+
+class ClipboardProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  Clipboard ptr;
+  final String name = ClipboardName;
+
+  ClipboardProxy(ClipboardProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _ClipboardProxyCalls(proxyImpl);
+
+  ClipboardProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new ClipboardProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _ClipboardProxyCalls(impl);
+  }
+
+  ClipboardProxy.fromHandle(core.MojoHandle handle) :
+      impl = new ClipboardProxyImpl.fromHandle(handle) {
+    ptr = new _ClipboardProxyCalls(impl);
+  }
+
+  ClipboardProxy.unbound() :
+      impl = new ClipboardProxyImpl.unbound() {
+    ptr = new _ClipboardProxyCalls(impl);
+  }
+
+  factory ClipboardProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    ClipboardProxy p = new ClipboardProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static ClipboardProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ClipboardProxy"));
+    return new ClipboardProxy.fromEndpoint(endpoint);
+  }
+
+  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 "ClipboardProxy($impl)";
+  }
+}
+
+
+class ClipboardStub extends bindings.Stub {
+  Clipboard _impl = null;
+
+  ClipboardStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  ClipboardStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  ClipboardStub.unbound() : super.unbound();
+
+  static ClipboardStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ClipboardStub"));
+    return new ClipboardStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = ClipboardName;
+
+
+  ClipboardGetSequenceNumberResponseParams _ClipboardGetSequenceNumberResponseParamsFactory(int sequence) {
+    var result = new ClipboardGetSequenceNumberResponseParams();
+    result.sequence = sequence;
+    return result;
+  }
+  ClipboardGetAvailableMimeTypesResponseParams _ClipboardGetAvailableMimeTypesResponseParamsFactory(List<String> types) {
+    var result = new ClipboardGetAvailableMimeTypesResponseParams();
+    result.types = types;
+    return result;
+  }
+  ClipboardReadMimeTypeResponseParams _ClipboardReadMimeTypeResponseParamsFactory(List<int> data) {
+    var result = new ClipboardReadMimeTypeResponseParams();
+    result.data = data;
+    return result;
+  }
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      case kClipboard_getSequenceNumber_name:
+        var params = ClipboardGetSequenceNumberParams.deserialize(
+            message.payload);
+        var response = _impl.getSequenceNumber(params.clipboardType,_ClipboardGetSequenceNumberResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kClipboard_getSequenceNumber_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kClipboard_getSequenceNumber_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      case kClipboard_getAvailableMimeTypes_name:
+        var params = ClipboardGetAvailableMimeTypesParams.deserialize(
+            message.payload);
+        var response = _impl.getAvailableMimeTypes(params.clipboardTypes,_ClipboardGetAvailableMimeTypesResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kClipboard_getAvailableMimeTypes_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kClipboard_getAvailableMimeTypes_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      case kClipboard_readMimeType_name:
+        var params = ClipboardReadMimeTypeParams.deserialize(
+            message.payload);
+        var response = _impl.readMimeType(params.clipboardType,params.mimeType,_ClipboardReadMimeTypeResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kClipboard_readMimeType_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kClipboard_readMimeType_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      case kClipboard_writeClipboardData_name:
+        var params = ClipboardWriteClipboardDataParams.deserialize(
+            message.payload);
+        _impl.writeClipboardData(params.clipboardType, params.data);
+        break;
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  Clipboard get impl => _impl;
+  set impl(Clipboard d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "ClipboardStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/command_buffer.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/command_buffer.mojom.dart
new file mode 100644
index 0000000..f35bc12
--- /dev/null
+++ b/mojo/dart/packages/mojo_services/lib/mojo/command_buffer.mojom.dart
@@ -0,0 +1,2002 @@
+// 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.
+
+library command_buffer_mojom;
+
+import 'dart:async';
+
+import 'package:mojo/bindings.dart' as bindings;
+import 'package:mojo/core.dart' as core;
+import 'package:mojo_services/mojo/gpu_capabilities.mojom.dart' as gpu_capabilities_mojom;
+
+
+
+class CommandBufferState extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(40, 0)
+  ];
+  int numEntries = 0;
+  int getOffset = 0;
+  int putOffset = 0;
+  int token = 0;
+  int error = 0;
+  int contextLostReason = 0;
+  int generation = 0;
+
+  CommandBufferState() : super(kVersions.last.size);
+
+  static CommandBufferState deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static CommandBufferState decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    CommandBufferState result = new CommandBufferState();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.numEntries = decoder0.decodeInt32(8);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.getOffset = decoder0.decodeInt32(12);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.putOffset = decoder0.decodeInt32(16);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.token = decoder0.decodeInt32(20);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.error = decoder0.decodeInt32(24);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.contextLostReason = decoder0.decodeInt32(28);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.generation = decoder0.decodeUint32(32);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeInt32(numEntries, 8);
+    
+    encoder0.encodeInt32(getOffset, 12);
+    
+    encoder0.encodeInt32(putOffset, 16);
+    
+    encoder0.encodeInt32(token, 20);
+    
+    encoder0.encodeInt32(error, 24);
+    
+    encoder0.encodeInt32(contextLostReason, 28);
+    
+    encoder0.encodeUint32(generation, 32);
+  }
+
+  String toString() {
+    return "CommandBufferState("
+           "numEntries: $numEntries" ", "
+           "getOffset: $getOffset" ", "
+           "putOffset: $putOffset" ", "
+           "token: $token" ", "
+           "error: $error" ", "
+           "contextLostReason: $contextLostReason" ", "
+           "generation: $generation" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["numEntries"] = numEntries;
+    map["getOffset"] = getOffset;
+    map["putOffset"] = putOffset;
+    map["token"] = token;
+    map["error"] = error;
+    map["contextLostReason"] = contextLostReason;
+    map["generation"] = generation;
+    return map;
+  }
+}
+
+
+class CommandBufferSyncClientDidInitializeParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  bool success = false;
+  gpu_capabilities_mojom.GpuCapabilities capabilities = null;
+
+  CommandBufferSyncClientDidInitializeParams() : super(kVersions.last.size);
+
+  static CommandBufferSyncClientDidInitializeParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static CommandBufferSyncClientDidInitializeParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    CommandBufferSyncClientDidInitializeParams result = new CommandBufferSyncClientDidInitializeParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.success = decoder0.decodeBool(8, 0);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(16, false);
+      result.capabilities = gpu_capabilities_mojom.GpuCapabilities.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeBool(success, 8, 0);
+    
+    encoder0.encodeStruct(capabilities, 16, false);
+  }
+
+  String toString() {
+    return "CommandBufferSyncClientDidInitializeParams("
+           "success: $success" ", "
+           "capabilities: $capabilities" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["success"] = success;
+    map["capabilities"] = capabilities;
+    return map;
+  }
+}
+
+
+class CommandBufferSyncClientDidMakeProgressParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  CommandBufferState state = null;
+
+  CommandBufferSyncClientDidMakeProgressParams() : super(kVersions.last.size);
+
+  static CommandBufferSyncClientDidMakeProgressParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static CommandBufferSyncClientDidMakeProgressParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    CommandBufferSyncClientDidMakeProgressParams result = new CommandBufferSyncClientDidMakeProgressParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, false);
+      result.state = CommandBufferState.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(state, 8, false);
+  }
+
+  String toString() {
+    return "CommandBufferSyncClientDidMakeProgressParams("
+           "state: $state" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["state"] = state;
+    return map;
+  }
+}
+
+
+class CommandBufferSyncPointClientDidInsertSyncPointParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  int syncPoint = 0;
+
+  CommandBufferSyncPointClientDidInsertSyncPointParams() : super(kVersions.last.size);
+
+  static CommandBufferSyncPointClientDidInsertSyncPointParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static CommandBufferSyncPointClientDidInsertSyncPointParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    CommandBufferSyncPointClientDidInsertSyncPointParams result = new CommandBufferSyncPointClientDidInsertSyncPointParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.syncPoint = decoder0.decodeUint32(8);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeUint32(syncPoint, 8);
+  }
+
+  String toString() {
+    return "CommandBufferSyncPointClientDidInsertSyncPointParams("
+           "syncPoint: $syncPoint" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["syncPoint"] = syncPoint;
+    return map;
+  }
+}
+
+
+class CommandBufferLostContextObserverDidLoseContextParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  int contextLostReason = 0;
+
+  CommandBufferLostContextObserverDidLoseContextParams() : super(kVersions.last.size);
+
+  static CommandBufferLostContextObserverDidLoseContextParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static CommandBufferLostContextObserverDidLoseContextParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    CommandBufferLostContextObserverDidLoseContextParams result = new CommandBufferLostContextObserverDidLoseContextParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.contextLostReason = decoder0.decodeInt32(8);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeInt32(contextLostReason, 8);
+  }
+
+  String toString() {
+    return "CommandBufferLostContextObserverDidLoseContextParams("
+           "contextLostReason: $contextLostReason" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["contextLostReason"] = contextLostReason;
+    return map;
+  }
+}
+
+
+class CommandBufferInitializeParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(40, 0)
+  ];
+  Object syncClient = null;
+  Object syncPointClient = null;
+  Object lostObserver = null;
+  core.MojoSharedBuffer sharedState = null;
+
+  CommandBufferInitializeParams() : super(kVersions.last.size);
+
+  static CommandBufferInitializeParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static CommandBufferInitializeParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    CommandBufferInitializeParams result = new CommandBufferInitializeParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.syncClient = decoder0.decodeServiceInterface(8, false, CommandBufferSyncClientProxy.newFromEndpoint);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.syncPointClient = decoder0.decodeServiceInterface(16, false, CommandBufferSyncPointClientProxy.newFromEndpoint);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.lostObserver = decoder0.decodeServiceInterface(24, false, CommandBufferLostContextObserverProxy.newFromEndpoint);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.sharedState = decoder0.decodeSharedBufferHandle(32, false);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeInterface(syncClient, 8, false);
+    
+    encoder0.encodeInterface(syncPointClient, 16, false);
+    
+    encoder0.encodeInterface(lostObserver, 24, false);
+    
+    encoder0.encodeSharedBufferHandle(sharedState, 32, false);
+  }
+
+  String toString() {
+    return "CommandBufferInitializeParams("
+           "syncClient: $syncClient" ", "
+           "syncPointClient: $syncPointClient" ", "
+           "lostObserver: $lostObserver" ", "
+           "sharedState: $sharedState" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+
+class CommandBufferSetGetBufferParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  int buffer = 0;
+
+  CommandBufferSetGetBufferParams() : super(kVersions.last.size);
+
+  static CommandBufferSetGetBufferParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static CommandBufferSetGetBufferParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    CommandBufferSetGetBufferParams result = new CommandBufferSetGetBufferParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.buffer = decoder0.decodeInt32(8);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeInt32(buffer, 8);
+  }
+
+  String toString() {
+    return "CommandBufferSetGetBufferParams("
+           "buffer: $buffer" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["buffer"] = buffer;
+    return map;
+  }
+}
+
+
+class CommandBufferFlushParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  int putOffset = 0;
+
+  CommandBufferFlushParams() : super(kVersions.last.size);
+
+  static CommandBufferFlushParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static CommandBufferFlushParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    CommandBufferFlushParams result = new CommandBufferFlushParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.putOffset = decoder0.decodeInt32(8);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeInt32(putOffset, 8);
+  }
+
+  String toString() {
+    return "CommandBufferFlushParams("
+           "putOffset: $putOffset" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["putOffset"] = putOffset;
+    return map;
+  }
+}
+
+
+class CommandBufferMakeProgressParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  int lastGetOffset = 0;
+
+  CommandBufferMakeProgressParams() : super(kVersions.last.size);
+
+  static CommandBufferMakeProgressParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static CommandBufferMakeProgressParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    CommandBufferMakeProgressParams result = new CommandBufferMakeProgressParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.lastGetOffset = decoder0.decodeInt32(8);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeInt32(lastGetOffset, 8);
+  }
+
+  String toString() {
+    return "CommandBufferMakeProgressParams("
+           "lastGetOffset: $lastGetOffset" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["lastGetOffset"] = lastGetOffset;
+    return map;
+  }
+}
+
+
+class CommandBufferRegisterTransferBufferParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  int id = 0;
+  core.MojoSharedBuffer transferBuffer = null;
+  int size = 0;
+
+  CommandBufferRegisterTransferBufferParams() : super(kVersions.last.size);
+
+  static CommandBufferRegisterTransferBufferParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static CommandBufferRegisterTransferBufferParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    CommandBufferRegisterTransferBufferParams result = new CommandBufferRegisterTransferBufferParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.id = decoder0.decodeInt32(8);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.transferBuffer = decoder0.decodeSharedBufferHandle(12, false);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.size = decoder0.decodeUint32(16);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeInt32(id, 8);
+    
+    encoder0.encodeSharedBufferHandle(transferBuffer, 12, false);
+    
+    encoder0.encodeUint32(size, 16);
+  }
+
+  String toString() {
+    return "CommandBufferRegisterTransferBufferParams("
+           "id: $id" ", "
+           "transferBuffer: $transferBuffer" ", "
+           "size: $size" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+
+class CommandBufferDestroyTransferBufferParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  int id = 0;
+
+  CommandBufferDestroyTransferBufferParams() : super(kVersions.last.size);
+
+  static CommandBufferDestroyTransferBufferParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static CommandBufferDestroyTransferBufferParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    CommandBufferDestroyTransferBufferParams result = new CommandBufferDestroyTransferBufferParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.id = decoder0.decodeInt32(8);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeInt32(id, 8);
+  }
+
+  String toString() {
+    return "CommandBufferDestroyTransferBufferParams("
+           "id: $id" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["id"] = id;
+    return map;
+  }
+}
+
+
+class CommandBufferInsertSyncPointParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  bool retire = false;
+
+  CommandBufferInsertSyncPointParams() : super(kVersions.last.size);
+
+  static CommandBufferInsertSyncPointParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static CommandBufferInsertSyncPointParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    CommandBufferInsertSyncPointParams result = new CommandBufferInsertSyncPointParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.retire = decoder0.decodeBool(8, 0);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeBool(retire, 8, 0);
+  }
+
+  String toString() {
+    return "CommandBufferInsertSyncPointParams("
+           "retire: $retire" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["retire"] = retire;
+    return map;
+  }
+}
+
+
+class CommandBufferRetireSyncPointParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  int syncPoint = 0;
+
+  CommandBufferRetireSyncPointParams() : super(kVersions.last.size);
+
+  static CommandBufferRetireSyncPointParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static CommandBufferRetireSyncPointParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    CommandBufferRetireSyncPointParams result = new CommandBufferRetireSyncPointParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.syncPoint = decoder0.decodeUint32(8);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeUint32(syncPoint, 8);
+  }
+
+  String toString() {
+    return "CommandBufferRetireSyncPointParams("
+           "syncPoint: $syncPoint" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["syncPoint"] = syncPoint;
+    return map;
+  }
+}
+
+
+class CommandBufferEchoParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(8, 0)
+  ];
+
+  CommandBufferEchoParams() : super(kVersions.last.size);
+
+  static CommandBufferEchoParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static CommandBufferEchoParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    CommandBufferEchoParams result = new CommandBufferEchoParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    encoder.getStructEncoderAtOffset(kVersions.last);
+  }
+
+  String toString() {
+    return "CommandBufferEchoParams("")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    return map;
+  }
+}
+
+
+class CommandBufferEchoResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(8, 0)
+  ];
+
+  CommandBufferEchoResponseParams() : super(kVersions.last.size);
+
+  static CommandBufferEchoResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static CommandBufferEchoResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    CommandBufferEchoResponseParams result = new CommandBufferEchoResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    encoder.getStructEncoderAtOffset(kVersions.last);
+  }
+
+  String toString() {
+    return "CommandBufferEchoResponseParams("")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    return map;
+  }
+}
+
+const int kCommandBufferSyncClient_didInitialize_name = 0;
+const int kCommandBufferSyncClient_didMakeProgress_name = 1;
+
+const String CommandBufferSyncClientName =
+      'mojo::CommandBufferSyncClient';
+
+abstract class CommandBufferSyncClient {
+  void didInitialize(bool success, gpu_capabilities_mojom.GpuCapabilities capabilities);
+  void didMakeProgress(CommandBufferState state);
+
+}
+
+
+class CommandBufferSyncClientProxyImpl extends bindings.Proxy {
+  CommandBufferSyncClientProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  CommandBufferSyncClientProxyImpl.fromHandle(core.MojoHandle handle) :
+      super.fromHandle(handle);
+
+  CommandBufferSyncClientProxyImpl.unbound() : super.unbound();
+
+  static CommandBufferSyncClientProxyImpl newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For CommandBufferSyncClientProxyImpl"));
+    return new CommandBufferSyncClientProxyImpl.fromEndpoint(endpoint);
+  }
+
+  String get name => CommandBufferSyncClientName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "CommandBufferSyncClientProxyImpl($superString)";
+  }
+}
+
+
+class _CommandBufferSyncClientProxyCalls implements CommandBufferSyncClient {
+  CommandBufferSyncClientProxyImpl _proxyImpl;
+
+  _CommandBufferSyncClientProxyCalls(this._proxyImpl);
+    void didInitialize(bool success, gpu_capabilities_mojom.GpuCapabilities capabilities) {
+      if (!_proxyImpl.isBound) {
+        _proxyImpl.proxyError("The Proxy is closed.");
+        return;
+      }
+      var params = new CommandBufferSyncClientDidInitializeParams();
+      params.success = success;
+      params.capabilities = capabilities;
+      _proxyImpl.sendMessage(params, kCommandBufferSyncClient_didInitialize_name);
+    }
+  
+    void didMakeProgress(CommandBufferState state) {
+      if (!_proxyImpl.isBound) {
+        _proxyImpl.proxyError("The Proxy is closed.");
+        return;
+      }
+      var params = new CommandBufferSyncClientDidMakeProgressParams();
+      params.state = state;
+      _proxyImpl.sendMessage(params, kCommandBufferSyncClient_didMakeProgress_name);
+    }
+  
+}
+
+
+class CommandBufferSyncClientProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  CommandBufferSyncClient ptr;
+  final String name = CommandBufferSyncClientName;
+
+  CommandBufferSyncClientProxy(CommandBufferSyncClientProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _CommandBufferSyncClientProxyCalls(proxyImpl);
+
+  CommandBufferSyncClientProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new CommandBufferSyncClientProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _CommandBufferSyncClientProxyCalls(impl);
+  }
+
+  CommandBufferSyncClientProxy.fromHandle(core.MojoHandle handle) :
+      impl = new CommandBufferSyncClientProxyImpl.fromHandle(handle) {
+    ptr = new _CommandBufferSyncClientProxyCalls(impl);
+  }
+
+  CommandBufferSyncClientProxy.unbound() :
+      impl = new CommandBufferSyncClientProxyImpl.unbound() {
+    ptr = new _CommandBufferSyncClientProxyCalls(impl);
+  }
+
+  factory CommandBufferSyncClientProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    CommandBufferSyncClientProxy p = new CommandBufferSyncClientProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static CommandBufferSyncClientProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For CommandBufferSyncClientProxy"));
+    return new CommandBufferSyncClientProxy.fromEndpoint(endpoint);
+  }
+
+  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 "CommandBufferSyncClientProxy($impl)";
+  }
+}
+
+
+class CommandBufferSyncClientStub extends bindings.Stub {
+  CommandBufferSyncClient _impl = null;
+
+  CommandBufferSyncClientStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  CommandBufferSyncClientStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  CommandBufferSyncClientStub.unbound() : super.unbound();
+
+  static CommandBufferSyncClientStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For CommandBufferSyncClientStub"));
+    return new CommandBufferSyncClientStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = CommandBufferSyncClientName;
+
+
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      case kCommandBufferSyncClient_didInitialize_name:
+        var params = CommandBufferSyncClientDidInitializeParams.deserialize(
+            message.payload);
+        _impl.didInitialize(params.success, params.capabilities);
+        break;
+      case kCommandBufferSyncClient_didMakeProgress_name:
+        var params = CommandBufferSyncClientDidMakeProgressParams.deserialize(
+            message.payload);
+        _impl.didMakeProgress(params.state);
+        break;
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  CommandBufferSyncClient get impl => _impl;
+  set impl(CommandBufferSyncClient d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "CommandBufferSyncClientStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+const int kCommandBufferSyncPointClient_didInsertSyncPoint_name = 0;
+
+const String CommandBufferSyncPointClientName =
+      'mojo::CommandBufferSyncPointClient';
+
+abstract class CommandBufferSyncPointClient {
+  void didInsertSyncPoint(int syncPoint);
+
+}
+
+
+class CommandBufferSyncPointClientProxyImpl extends bindings.Proxy {
+  CommandBufferSyncPointClientProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  CommandBufferSyncPointClientProxyImpl.fromHandle(core.MojoHandle handle) :
+      super.fromHandle(handle);
+
+  CommandBufferSyncPointClientProxyImpl.unbound() : super.unbound();
+
+  static CommandBufferSyncPointClientProxyImpl newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For CommandBufferSyncPointClientProxyImpl"));
+    return new CommandBufferSyncPointClientProxyImpl.fromEndpoint(endpoint);
+  }
+
+  String get name => CommandBufferSyncPointClientName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "CommandBufferSyncPointClientProxyImpl($superString)";
+  }
+}
+
+
+class _CommandBufferSyncPointClientProxyCalls implements CommandBufferSyncPointClient {
+  CommandBufferSyncPointClientProxyImpl _proxyImpl;
+
+  _CommandBufferSyncPointClientProxyCalls(this._proxyImpl);
+    void didInsertSyncPoint(int syncPoint) {
+      if (!_proxyImpl.isBound) {
+        _proxyImpl.proxyError("The Proxy is closed.");
+        return;
+      }
+      var params = new CommandBufferSyncPointClientDidInsertSyncPointParams();
+      params.syncPoint = syncPoint;
+      _proxyImpl.sendMessage(params, kCommandBufferSyncPointClient_didInsertSyncPoint_name);
+    }
+  
+}
+
+
+class CommandBufferSyncPointClientProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  CommandBufferSyncPointClient ptr;
+  final String name = CommandBufferSyncPointClientName;
+
+  CommandBufferSyncPointClientProxy(CommandBufferSyncPointClientProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _CommandBufferSyncPointClientProxyCalls(proxyImpl);
+
+  CommandBufferSyncPointClientProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new CommandBufferSyncPointClientProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _CommandBufferSyncPointClientProxyCalls(impl);
+  }
+
+  CommandBufferSyncPointClientProxy.fromHandle(core.MojoHandle handle) :
+      impl = new CommandBufferSyncPointClientProxyImpl.fromHandle(handle) {
+    ptr = new _CommandBufferSyncPointClientProxyCalls(impl);
+  }
+
+  CommandBufferSyncPointClientProxy.unbound() :
+      impl = new CommandBufferSyncPointClientProxyImpl.unbound() {
+    ptr = new _CommandBufferSyncPointClientProxyCalls(impl);
+  }
+
+  factory CommandBufferSyncPointClientProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    CommandBufferSyncPointClientProxy p = new CommandBufferSyncPointClientProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static CommandBufferSyncPointClientProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For CommandBufferSyncPointClientProxy"));
+    return new CommandBufferSyncPointClientProxy.fromEndpoint(endpoint);
+  }
+
+  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 "CommandBufferSyncPointClientProxy($impl)";
+  }
+}
+
+
+class CommandBufferSyncPointClientStub extends bindings.Stub {
+  CommandBufferSyncPointClient _impl = null;
+
+  CommandBufferSyncPointClientStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  CommandBufferSyncPointClientStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  CommandBufferSyncPointClientStub.unbound() : super.unbound();
+
+  static CommandBufferSyncPointClientStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For CommandBufferSyncPointClientStub"));
+    return new CommandBufferSyncPointClientStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = CommandBufferSyncPointClientName;
+
+
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      case kCommandBufferSyncPointClient_didInsertSyncPoint_name:
+        var params = CommandBufferSyncPointClientDidInsertSyncPointParams.deserialize(
+            message.payload);
+        _impl.didInsertSyncPoint(params.syncPoint);
+        break;
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  CommandBufferSyncPointClient get impl => _impl;
+  set impl(CommandBufferSyncPointClient d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "CommandBufferSyncPointClientStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+const int kCommandBufferLostContextObserver_didLoseContext_name = 0;
+
+const String CommandBufferLostContextObserverName =
+      'mojo::CommandBufferLostContextObserver';
+
+abstract class CommandBufferLostContextObserver {
+  void didLoseContext(int contextLostReason);
+
+}
+
+
+class CommandBufferLostContextObserverProxyImpl extends bindings.Proxy {
+  CommandBufferLostContextObserverProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  CommandBufferLostContextObserverProxyImpl.fromHandle(core.MojoHandle handle) :
+      super.fromHandle(handle);
+
+  CommandBufferLostContextObserverProxyImpl.unbound() : super.unbound();
+
+  static CommandBufferLostContextObserverProxyImpl newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For CommandBufferLostContextObserverProxyImpl"));
+    return new CommandBufferLostContextObserverProxyImpl.fromEndpoint(endpoint);
+  }
+
+  String get name => CommandBufferLostContextObserverName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "CommandBufferLostContextObserverProxyImpl($superString)";
+  }
+}
+
+
+class _CommandBufferLostContextObserverProxyCalls implements CommandBufferLostContextObserver {
+  CommandBufferLostContextObserverProxyImpl _proxyImpl;
+
+  _CommandBufferLostContextObserverProxyCalls(this._proxyImpl);
+    void didLoseContext(int contextLostReason) {
+      if (!_proxyImpl.isBound) {
+        _proxyImpl.proxyError("The Proxy is closed.");
+        return;
+      }
+      var params = new CommandBufferLostContextObserverDidLoseContextParams();
+      params.contextLostReason = contextLostReason;
+      _proxyImpl.sendMessage(params, kCommandBufferLostContextObserver_didLoseContext_name);
+    }
+  
+}
+
+
+class CommandBufferLostContextObserverProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  CommandBufferLostContextObserver ptr;
+  final String name = CommandBufferLostContextObserverName;
+
+  CommandBufferLostContextObserverProxy(CommandBufferLostContextObserverProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _CommandBufferLostContextObserverProxyCalls(proxyImpl);
+
+  CommandBufferLostContextObserverProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new CommandBufferLostContextObserverProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _CommandBufferLostContextObserverProxyCalls(impl);
+  }
+
+  CommandBufferLostContextObserverProxy.fromHandle(core.MojoHandle handle) :
+      impl = new CommandBufferLostContextObserverProxyImpl.fromHandle(handle) {
+    ptr = new _CommandBufferLostContextObserverProxyCalls(impl);
+  }
+
+  CommandBufferLostContextObserverProxy.unbound() :
+      impl = new CommandBufferLostContextObserverProxyImpl.unbound() {
+    ptr = new _CommandBufferLostContextObserverProxyCalls(impl);
+  }
+
+  factory CommandBufferLostContextObserverProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    CommandBufferLostContextObserverProxy p = new CommandBufferLostContextObserverProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static CommandBufferLostContextObserverProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For CommandBufferLostContextObserverProxy"));
+    return new CommandBufferLostContextObserverProxy.fromEndpoint(endpoint);
+  }
+
+  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 "CommandBufferLostContextObserverProxy($impl)";
+  }
+}
+
+
+class CommandBufferLostContextObserverStub extends bindings.Stub {
+  CommandBufferLostContextObserver _impl = null;
+
+  CommandBufferLostContextObserverStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  CommandBufferLostContextObserverStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  CommandBufferLostContextObserverStub.unbound() : super.unbound();
+
+  static CommandBufferLostContextObserverStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For CommandBufferLostContextObserverStub"));
+    return new CommandBufferLostContextObserverStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = CommandBufferLostContextObserverName;
+
+
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      case kCommandBufferLostContextObserver_didLoseContext_name:
+        var params = CommandBufferLostContextObserverDidLoseContextParams.deserialize(
+            message.payload);
+        _impl.didLoseContext(params.contextLostReason);
+        break;
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  CommandBufferLostContextObserver get impl => _impl;
+  set impl(CommandBufferLostContextObserver d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "CommandBufferLostContextObserverStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+const int kCommandBuffer_initialize_name = 0;
+const int kCommandBuffer_setGetBuffer_name = 1;
+const int kCommandBuffer_flush_name = 2;
+const int kCommandBuffer_makeProgress_name = 3;
+const int kCommandBuffer_registerTransferBuffer_name = 4;
+const int kCommandBuffer_destroyTransferBuffer_name = 5;
+const int kCommandBuffer_insertSyncPoint_name = 6;
+const int kCommandBuffer_retireSyncPoint_name = 7;
+const int kCommandBuffer_echo_name = 8;
+
+const String CommandBufferName =
+      'mojo::CommandBuffer';
+
+abstract class CommandBuffer {
+  void initialize(Object syncClient, Object syncPointClient, Object lostObserver, core.MojoSharedBuffer sharedState);
+  void setGetBuffer(int buffer);
+  void flush(int putOffset);
+  void makeProgress(int lastGetOffset);
+  void registerTransferBuffer(int id, core.MojoSharedBuffer transferBuffer, int size);
+  void destroyTransferBuffer(int id);
+  void insertSyncPoint(bool retire);
+  void retireSyncPoint(int syncPoint);
+  dynamic echo([Function responseFactory = null]);
+
+}
+
+
+class CommandBufferProxyImpl extends bindings.Proxy {
+  CommandBufferProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  CommandBufferProxyImpl.fromHandle(core.MojoHandle handle) :
+      super.fromHandle(handle);
+
+  CommandBufferProxyImpl.unbound() : super.unbound();
+
+  static CommandBufferProxyImpl newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For CommandBufferProxyImpl"));
+    return new CommandBufferProxyImpl.fromEndpoint(endpoint);
+  }
+
+  String get name => CommandBufferName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      case kCommandBuffer_echo_name:
+        var r = CommandBufferEchoResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "CommandBufferProxyImpl($superString)";
+  }
+}
+
+
+class _CommandBufferProxyCalls implements CommandBuffer {
+  CommandBufferProxyImpl _proxyImpl;
+
+  _CommandBufferProxyCalls(this._proxyImpl);
+    void initialize(Object syncClient, Object syncPointClient, Object lostObserver, core.MojoSharedBuffer sharedState) {
+      if (!_proxyImpl.isBound) {
+        _proxyImpl.proxyError("The Proxy is closed.");
+        return;
+      }
+      var params = new CommandBufferInitializeParams();
+      params.syncClient = syncClient;
+      params.syncPointClient = syncPointClient;
+      params.lostObserver = lostObserver;
+      params.sharedState = sharedState;
+      _proxyImpl.sendMessage(params, kCommandBuffer_initialize_name);
+    }
+  
+    void setGetBuffer(int buffer) {
+      if (!_proxyImpl.isBound) {
+        _proxyImpl.proxyError("The Proxy is closed.");
+        return;
+      }
+      var params = new CommandBufferSetGetBufferParams();
+      params.buffer = buffer;
+      _proxyImpl.sendMessage(params, kCommandBuffer_setGetBuffer_name);
+    }
+  
+    void flush(int putOffset) {
+      if (!_proxyImpl.isBound) {
+        _proxyImpl.proxyError("The Proxy is closed.");
+        return;
+      }
+      var params = new CommandBufferFlushParams();
+      params.putOffset = putOffset;
+      _proxyImpl.sendMessage(params, kCommandBuffer_flush_name);
+    }
+  
+    void makeProgress(int lastGetOffset) {
+      if (!_proxyImpl.isBound) {
+        _proxyImpl.proxyError("The Proxy is closed.");
+        return;
+      }
+      var params = new CommandBufferMakeProgressParams();
+      params.lastGetOffset = lastGetOffset;
+      _proxyImpl.sendMessage(params, kCommandBuffer_makeProgress_name);
+    }
+  
+    void registerTransferBuffer(int id, core.MojoSharedBuffer transferBuffer, int size) {
+      if (!_proxyImpl.isBound) {
+        _proxyImpl.proxyError("The Proxy is closed.");
+        return;
+      }
+      var params = new CommandBufferRegisterTransferBufferParams();
+      params.id = id;
+      params.transferBuffer = transferBuffer;
+      params.size = size;
+      _proxyImpl.sendMessage(params, kCommandBuffer_registerTransferBuffer_name);
+    }
+  
+    void destroyTransferBuffer(int id) {
+      if (!_proxyImpl.isBound) {
+        _proxyImpl.proxyError("The Proxy is closed.");
+        return;
+      }
+      var params = new CommandBufferDestroyTransferBufferParams();
+      params.id = id;
+      _proxyImpl.sendMessage(params, kCommandBuffer_destroyTransferBuffer_name);
+    }
+  
+    void insertSyncPoint(bool retire) {
+      if (!_proxyImpl.isBound) {
+        _proxyImpl.proxyError("The Proxy is closed.");
+        return;
+      }
+      var params = new CommandBufferInsertSyncPointParams();
+      params.retire = retire;
+      _proxyImpl.sendMessage(params, kCommandBuffer_insertSyncPoint_name);
+    }
+  
+    void retireSyncPoint(int syncPoint) {
+      if (!_proxyImpl.isBound) {
+        _proxyImpl.proxyError("The Proxy is closed.");
+        return;
+      }
+      var params = new CommandBufferRetireSyncPointParams();
+      params.syncPoint = syncPoint;
+      _proxyImpl.sendMessage(params, kCommandBuffer_retireSyncPoint_name);
+    }
+  
+    dynamic echo([Function responseFactory = null]) {
+      var params = new CommandBufferEchoParams();
+      return _proxyImpl.sendMessageWithRequestId(
+          params,
+          kCommandBuffer_echo_name,
+          -1,
+          bindings.MessageHeader.kMessageExpectsResponse);
+    }
+}
+
+
+class CommandBufferProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  CommandBuffer ptr;
+  final String name = CommandBufferName;
+
+  CommandBufferProxy(CommandBufferProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _CommandBufferProxyCalls(proxyImpl);
+
+  CommandBufferProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new CommandBufferProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _CommandBufferProxyCalls(impl);
+  }
+
+  CommandBufferProxy.fromHandle(core.MojoHandle handle) :
+      impl = new CommandBufferProxyImpl.fromHandle(handle) {
+    ptr = new _CommandBufferProxyCalls(impl);
+  }
+
+  CommandBufferProxy.unbound() :
+      impl = new CommandBufferProxyImpl.unbound() {
+    ptr = new _CommandBufferProxyCalls(impl);
+  }
+
+  factory CommandBufferProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    CommandBufferProxy p = new CommandBufferProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static CommandBufferProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For CommandBufferProxy"));
+    return new CommandBufferProxy.fromEndpoint(endpoint);
+  }
+
+  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 "CommandBufferProxy($impl)";
+  }
+}
+
+
+class CommandBufferStub extends bindings.Stub {
+  CommandBuffer _impl = null;
+
+  CommandBufferStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  CommandBufferStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  CommandBufferStub.unbound() : super.unbound();
+
+  static CommandBufferStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For CommandBufferStub"));
+    return new CommandBufferStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = CommandBufferName;
+
+
+  CommandBufferEchoResponseParams _CommandBufferEchoResponseParamsFactory() {
+    var result = new CommandBufferEchoResponseParams();
+    return result;
+  }
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      case kCommandBuffer_initialize_name:
+        var params = CommandBufferInitializeParams.deserialize(
+            message.payload);
+        _impl.initialize(params.syncClient, params.syncPointClient, params.lostObserver, params.sharedState);
+        break;
+      case kCommandBuffer_setGetBuffer_name:
+        var params = CommandBufferSetGetBufferParams.deserialize(
+            message.payload);
+        _impl.setGetBuffer(params.buffer);
+        break;
+      case kCommandBuffer_flush_name:
+        var params = CommandBufferFlushParams.deserialize(
+            message.payload);
+        _impl.flush(params.putOffset);
+        break;
+      case kCommandBuffer_makeProgress_name:
+        var params = CommandBufferMakeProgressParams.deserialize(
+            message.payload);
+        _impl.makeProgress(params.lastGetOffset);
+        break;
+      case kCommandBuffer_registerTransferBuffer_name:
+        var params = CommandBufferRegisterTransferBufferParams.deserialize(
+            message.payload);
+        _impl.registerTransferBuffer(params.id, params.transferBuffer, params.size);
+        break;
+      case kCommandBuffer_destroyTransferBuffer_name:
+        var params = CommandBufferDestroyTransferBufferParams.deserialize(
+            message.payload);
+        _impl.destroyTransferBuffer(params.id);
+        break;
+      case kCommandBuffer_insertSyncPoint_name:
+        var params = CommandBufferInsertSyncPointParams.deserialize(
+            message.payload);
+        _impl.insertSyncPoint(params.retire);
+        break;
+      case kCommandBuffer_retireSyncPoint_name:
+        var params = CommandBufferRetireSyncPointParams.deserialize(
+            message.payload);
+        _impl.retireSyncPoint(params.syncPoint);
+        break;
+      case kCommandBuffer_echo_name:
+        var params = CommandBufferEchoParams.deserialize(
+            message.payload);
+        var response = _impl.echo(_CommandBufferEchoResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kCommandBuffer_echo_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kCommandBuffer_echo_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  CommandBuffer get impl => _impl;
+  set impl(CommandBuffer d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "CommandBufferStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+
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
new file mode 100644
index 0000000..3dd3ffd
--- /dev/null
+++ b/mojo/dart/packages/mojo_services/lib/mojo/content_handler.mojom.dart
@@ -0,0 +1,266 @@
+// 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.
+
+library content_handler_mojom;
+
+import 'dart:async';
+
+import 'package:mojo/bindings.dart' as bindings;
+import 'package:mojo/core.dart' as core;
+import 'package:mojo/mojo/application.mojom.dart' as application_mojom;
+import 'package:mojo/mojo/url_response.mojom.dart' as url_response_mojom;
+
+
+
+class ContentHandlerStartApplicationParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  Object application = null;
+  url_response_mojom.UrlResponse response = null;
+
+  ContentHandlerStartApplicationParams() : super(kVersions.last.size);
+
+  static ContentHandlerStartApplicationParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ContentHandlerStartApplicationParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ContentHandlerStartApplicationParams result = new ContentHandlerStartApplicationParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.application = decoder0.decodeInterfaceRequest(8, false, application_mojom.ApplicationStub.newFromEndpoint);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(16, false);
+      result.response = url_response_mojom.UrlResponse.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeInterfaceRequest(application, 8, false);
+    
+    encoder0.encodeStruct(response, 16, false);
+  }
+
+  String toString() {
+    return "ContentHandlerStartApplicationParams("
+           "application: $application" ", "
+           "response: $response" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+const int kContentHandler_startApplication_name = 0;
+
+const String ContentHandlerName =
+      'mojo::ContentHandler';
+
+abstract class ContentHandler {
+  void startApplication(Object application, url_response_mojom.UrlResponse response);
+
+}
+
+
+class ContentHandlerProxyImpl extends bindings.Proxy {
+  ContentHandlerProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  ContentHandlerProxyImpl.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);
+  }
+
+  String get name => ContentHandlerName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "ContentHandlerProxyImpl($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, kContentHandler_startApplication_name);
+    }
+  
+}
+
+
+class ContentHandlerProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  ContentHandler ptr;
+  final String name = ContentHandlerName;
+
+  ContentHandlerProxy(ContentHandlerProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _ContentHandlerProxyCalls(proxyImpl);
+
+  ContentHandlerProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new ContentHandlerProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _ContentHandlerProxyCalls(impl);
+  }
+
+  ContentHandlerProxy.fromHandle(core.MojoHandle handle) :
+      impl = new ContentHandlerProxyImpl.fromHandle(handle) {
+    ptr = new _ContentHandlerProxyCalls(impl);
+  }
+
+  ContentHandlerProxy.unbound() :
+      impl = new ContentHandlerProxyImpl.unbound() {
+    ptr = new _ContentHandlerProxyCalls(impl);
+  }
+
+  factory ContentHandlerProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    ContentHandlerProxy p = new ContentHandlerProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static ContentHandlerProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ContentHandlerProxy"));
+    return new ContentHandlerProxy.fromEndpoint(endpoint);
+  }
+
+  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)";
+  }
+}
+
+
+class ContentHandlerStub extends bindings.Stub {
+  ContentHandler _impl = null;
+
+  ContentHandlerStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  ContentHandlerStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  ContentHandlerStub.unbound() : super.unbound();
+
+  static ContentHandlerStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ContentHandlerStub"));
+    return new ContentHandlerStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = ContentHandlerName;
+
+
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      case kContentHandler_startApplication_name:
+        var params = ContentHandlerStartApplicationParams.deserialize(
+            message.payload);
+        _impl.startApplication(params.application, params.response);
+        break;
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  ContentHandler get impl => _impl;
+  set impl(ContentHandler d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "ContentHandlerStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/context_provider.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/context_provider.mojom.dart
new file mode 100644
index 0000000..f5c2554
--- /dev/null
+++ b/mojo/dart/packages/mojo_services/lib/mojo/context_provider.mojom.dart
@@ -0,0 +1,363 @@
+// 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.
+
+library context_provider_mojom;
+
+import 'dart:async';
+
+import 'package:mojo/bindings.dart' as bindings;
+import 'package:mojo/core.dart' as core;
+import 'package:mojo_services/mojo/command_buffer.mojom.dart' as command_buffer_mojom;
+import 'package:mojo_services/mojo/viewport_parameter_listener.mojom.dart' as viewport_parameter_listener_mojom;
+
+
+
+class ContextProviderCreateParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  Object viewportParameterListener = null;
+
+  ContextProviderCreateParams() : super(kVersions.last.size);
+
+  static ContextProviderCreateParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ContextProviderCreateParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ContextProviderCreateParams result = new ContextProviderCreateParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.viewportParameterListener = decoder0.decodeServiceInterface(8, true, viewport_parameter_listener_mojom.ViewportParameterListenerProxy.newFromEndpoint);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeInterface(viewportParameterListener, 8, true);
+  }
+
+  String toString() {
+    return "ContextProviderCreateParams("
+           "viewportParameterListener: $viewportParameterListener" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+
+class ContextProviderCreateResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  Object gles2Client = null;
+
+  ContextProviderCreateResponseParams() : super(kVersions.last.size);
+
+  static ContextProviderCreateResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ContextProviderCreateResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ContextProviderCreateResponseParams result = new ContextProviderCreateResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.gles2Client = decoder0.decodeServiceInterface(8, true, command_buffer_mojom.CommandBufferProxy.newFromEndpoint);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeInterface(gles2Client, 8, true);
+  }
+
+  String toString() {
+    return "ContextProviderCreateResponseParams("
+           "gles2Client: $gles2Client" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+const int kContextProvider_create_name = 0;
+
+const String ContextProviderName =
+      'mojo::ContextProvider';
+
+abstract class ContextProvider {
+  dynamic create(Object viewportParameterListener,[Function responseFactory = null]);
+
+}
+
+
+class ContextProviderProxyImpl extends bindings.Proxy {
+  ContextProviderProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  ContextProviderProxyImpl.fromHandle(core.MojoHandle handle) :
+      super.fromHandle(handle);
+
+  ContextProviderProxyImpl.unbound() : super.unbound();
+
+  static ContextProviderProxyImpl newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ContextProviderProxyImpl"));
+    return new ContextProviderProxyImpl.fromEndpoint(endpoint);
+  }
+
+  String get name => ContextProviderName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      case kContextProvider_create_name:
+        var r = ContextProviderCreateResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "ContextProviderProxyImpl($superString)";
+  }
+}
+
+
+class _ContextProviderProxyCalls implements ContextProvider {
+  ContextProviderProxyImpl _proxyImpl;
+
+  _ContextProviderProxyCalls(this._proxyImpl);
+    dynamic create(Object viewportParameterListener,[Function responseFactory = null]) {
+      var params = new ContextProviderCreateParams();
+      params.viewportParameterListener = viewportParameterListener;
+      return _proxyImpl.sendMessageWithRequestId(
+          params,
+          kContextProvider_create_name,
+          -1,
+          bindings.MessageHeader.kMessageExpectsResponse);
+    }
+}
+
+
+class ContextProviderProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  ContextProvider ptr;
+  final String name = ContextProviderName;
+
+  ContextProviderProxy(ContextProviderProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _ContextProviderProxyCalls(proxyImpl);
+
+  ContextProviderProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new ContextProviderProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _ContextProviderProxyCalls(impl);
+  }
+
+  ContextProviderProxy.fromHandle(core.MojoHandle handle) :
+      impl = new ContextProviderProxyImpl.fromHandle(handle) {
+    ptr = new _ContextProviderProxyCalls(impl);
+  }
+
+  ContextProviderProxy.unbound() :
+      impl = new ContextProviderProxyImpl.unbound() {
+    ptr = new _ContextProviderProxyCalls(impl);
+  }
+
+  factory ContextProviderProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    ContextProviderProxy p = new ContextProviderProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static ContextProviderProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ContextProviderProxy"));
+    return new ContextProviderProxy.fromEndpoint(endpoint);
+  }
+
+  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 "ContextProviderProxy($impl)";
+  }
+}
+
+
+class ContextProviderStub extends bindings.Stub {
+  ContextProvider _impl = null;
+
+  ContextProviderStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  ContextProviderStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  ContextProviderStub.unbound() : super.unbound();
+
+  static ContextProviderStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ContextProviderStub"));
+    return new ContextProviderStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = ContextProviderName;
+
+
+  ContextProviderCreateResponseParams _ContextProviderCreateResponseParamsFactory(Object gles2Client) {
+    var result = new ContextProviderCreateResponseParams();
+    result.gles2Client = gles2Client;
+    return result;
+  }
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      case kContextProvider_create_name:
+        var params = ContextProviderCreateParams.deserialize(
+            message.payload);
+        var response = _impl.create(params.viewportParameterListener,_ContextProviderCreateResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kContextProvider_create_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kContextProvider_create_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  ContextProvider get impl => _impl;
+  set impl(ContextProvider d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "ContextProviderStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+
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
new file mode 100644
index 0000000..5b0aaa8
--- /dev/null
+++ b/mojo/dart/packages/mojo_services/lib/mojo/cookie_store.mojom.dart
@@ -0,0 +1,565 @@
+// 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.
+
+library cookie_store_mojom;
+
+import 'dart:async';
+
+import 'package:mojo/bindings.dart' as bindings;
+import 'package:mojo/core.dart' as core;
+
+
+
+class CookieStoreGetParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  String url = null;
+
+  CookieStoreGetParams() : super(kVersions.last.size);
+
+  static CookieStoreGetParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static CookieStoreGetParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    CookieStoreGetParams result = new CookieStoreGetParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.url = decoder0.decodeString(8, false);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeString(url, 8, false);
+  }
+
+  String toString() {
+    return "CookieStoreGetParams("
+           "url: $url" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["url"] = url;
+    return map;
+  }
+}
+
+
+class CookieStoreGetResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  String cookies = null;
+
+  CookieStoreGetResponseParams() : super(kVersions.last.size);
+
+  static CookieStoreGetResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static CookieStoreGetResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    CookieStoreGetResponseParams result = new CookieStoreGetResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.cookies = decoder0.decodeString(8, false);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeString(cookies, 8, false);
+  }
+
+  String toString() {
+    return "CookieStoreGetResponseParams("
+           "cookies: $cookies" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["cookies"] = cookies;
+    return map;
+  }
+}
+
+
+class CookieStoreSetParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  String url = null;
+  String cookie = null;
+
+  CookieStoreSetParams() : super(kVersions.last.size);
+
+  static CookieStoreSetParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static CookieStoreSetParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    CookieStoreSetParams result = new CookieStoreSetParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.url = decoder0.decodeString(8, false);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.cookie = decoder0.decodeString(16, false);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeString(url, 8, false);
+    
+    encoder0.encodeString(cookie, 16, false);
+  }
+
+  String toString() {
+    return "CookieStoreSetParams("
+           "url: $url" ", "
+           "cookie: $cookie" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["url"] = url;
+    map["cookie"] = cookie;
+    return map;
+  }
+}
+
+
+class CookieStoreSetResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  bool success = false;
+
+  CookieStoreSetResponseParams() : super(kVersions.last.size);
+
+  static CookieStoreSetResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static CookieStoreSetResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    CookieStoreSetResponseParams result = new CookieStoreSetResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.success = decoder0.decodeBool(8, 0);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeBool(success, 8, 0);
+  }
+
+  String toString() {
+    return "CookieStoreSetResponseParams("
+           "success: $success" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["success"] = success;
+    return map;
+  }
+}
+
+const int kCookieStore_get_name = 0;
+const int kCookieStore_set_name = 1;
+
+const String CookieStoreName =
+      'mojo::CookieStore';
+
+abstract class CookieStore {
+  dynamic get(String url,[Function responseFactory = null]);
+  dynamic set(String url,String cookie,[Function responseFactory = null]);
+
+}
+
+
+class CookieStoreProxyImpl extends bindings.Proxy {
+  CookieStoreProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  CookieStoreProxyImpl.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);
+  }
+
+  String get name => CookieStoreName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      case kCookieStore_get_name:
+        var r = CookieStoreGetResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      case kCookieStore_set_name:
+        var r = CookieStoreSetResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "CookieStoreProxyImpl($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,
+          kCookieStore_get_name,
+          -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,
+          kCookieStore_set_name,
+          -1,
+          bindings.MessageHeader.kMessageExpectsResponse);
+    }
+}
+
+
+class CookieStoreProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  CookieStore ptr;
+  final String name = CookieStoreName;
+
+  CookieStoreProxy(CookieStoreProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _CookieStoreProxyCalls(proxyImpl);
+
+  CookieStoreProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new CookieStoreProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _CookieStoreProxyCalls(impl);
+  }
+
+  CookieStoreProxy.fromHandle(core.MojoHandle handle) :
+      impl = new CookieStoreProxyImpl.fromHandle(handle) {
+    ptr = new _CookieStoreProxyCalls(impl);
+  }
+
+  CookieStoreProxy.unbound() :
+      impl = new CookieStoreProxyImpl.unbound() {
+    ptr = new _CookieStoreProxyCalls(impl);
+  }
+
+  factory CookieStoreProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    CookieStoreProxy p = new CookieStoreProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static CookieStoreProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For CookieStoreProxy"));
+    return new CookieStoreProxy.fromEndpoint(endpoint);
+  }
+
+  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)";
+  }
+}
+
+
+class CookieStoreStub extends bindings.Stub {
+  CookieStore _impl = null;
+
+  CookieStoreStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  CookieStoreStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  CookieStoreStub.unbound() : super.unbound();
+
+  static CookieStoreStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For CookieStoreStub"));
+    return new CookieStoreStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = CookieStoreName;
+
+
+  CookieStoreGetResponseParams _CookieStoreGetResponseParamsFactory(String cookies) {
+    var result = new CookieStoreGetResponseParams();
+    result.cookies = cookies;
+    return result;
+  }
+  CookieStoreSetResponseParams _CookieStoreSetResponseParamsFactory(bool success) {
+    var result = new CookieStoreSetResponseParams();
+    result.success = success;
+    return result;
+  }
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      case kCookieStore_get_name:
+        var params = CookieStoreGetParams.deserialize(
+            message.payload);
+        var response = _impl.get(params.url,_CookieStoreGetResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kCookieStore_get_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kCookieStore_get_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      case kCookieStore_set_name:
+        var params = CookieStoreSetParams.deserialize(
+            message.payload);
+        var response = _impl.set(params.url,params.cookie,_CookieStoreSetResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kCookieStore_set_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kCookieStore_set_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  CookieStore get impl => _impl;
+  set impl(CookieStore d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "CookieStoreStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+
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
new file mode 100644
index 0000000..2908053
--- /dev/null
+++ b/mojo/dart/packages/mojo_services/lib/mojo/device_info.mojom.dart
@@ -0,0 +1,441 @@
+// 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.
+
+library device_info_mojom;
+
+import 'dart:async';
+
+import 'package:mojo/bindings.dart' as bindings;
+import 'package:mojo/core.dart' as core;
+
+
+
+class DeviceInfoGetDeviceTypeParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(8, 0)
+  ];
+
+  DeviceInfoGetDeviceTypeParams() : super(kVersions.last.size);
+
+  static DeviceInfoGetDeviceTypeParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static DeviceInfoGetDeviceTypeParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    DeviceInfoGetDeviceTypeParams result = new DeviceInfoGetDeviceTypeParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    encoder.getStructEncoderAtOffset(kVersions.last);
+  }
+
+  String toString() {
+    return "DeviceInfoGetDeviceTypeParams("")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    return map;
+  }
+}
+
+
+class DeviceInfoGetDeviceTypeResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  DeviceInfoDeviceType deviceType = null;
+
+  DeviceInfoGetDeviceTypeResponseParams() : super(kVersions.last.size);
+
+  static DeviceInfoGetDeviceTypeResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static DeviceInfoGetDeviceTypeResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    DeviceInfoGetDeviceTypeResponseParams result = new DeviceInfoGetDeviceTypeResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+        result.deviceType = DeviceInfoDeviceType.decode(decoder0, 8);
+        if (result.deviceType == null) {
+          throw new bindings.MojoCodecError(
+            'Trying to decode null union for non-nullable DeviceInfoDeviceType.');
+        }
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeEnum(deviceType, 8);
+  }
+
+  String toString() {
+    return "DeviceInfoGetDeviceTypeResponseParams("
+           "deviceType: $deviceType" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["deviceType"] = deviceType;
+    return map;
+  }
+}
+
+const int kDeviceInfo_getDeviceType_name = 0;
+
+const String DeviceInfoName =
+      'mojo::DeviceInfo';
+  class DeviceInfoDeviceType extends bindings.MojoEnum {
+  static const UNKNOWN = const DeviceInfoDeviceType._(0);
+  static const HEADLESS = const DeviceInfoDeviceType._(1);
+  static const WATCH = const DeviceInfoDeviceType._(2);
+  static const PHONE = const DeviceInfoDeviceType._(3);
+  static const TABLET = const DeviceInfoDeviceType._(4);
+  static const DESKTOP = const DeviceInfoDeviceType._(5);
+  static const TV = const DeviceInfoDeviceType._(6);
+
+  const DeviceInfoDeviceType._(int v) : super(v);
+
+  static const Map<String, DeviceInfoDeviceType> valuesMap = const {
+    "UNKNOWN": UNKNOWN,
+    "HEADLESS": HEADLESS,
+    "WATCH": WATCH,
+    "PHONE": PHONE,
+    "TABLET": TABLET,
+    "DESKTOP": DESKTOP,
+    "TV": TV,
+  };
+  static const List<DeviceInfoDeviceType> values = const [
+    UNKNOWN,
+    HEADLESS,
+    WATCH,
+    PHONE,
+    TABLET,
+    DESKTOP,
+    TV,
+  ];
+
+  static DeviceInfoDeviceType valueOf(String name) => valuesMap[name];
+
+  factory DeviceInfoDeviceType(int v) {
+    switch (v) {
+      case 0:
+        return UNKNOWN;
+      case 1:
+        return HEADLESS;
+      case 2:
+        return WATCH;
+      case 3:
+        return PHONE;
+      case 4:
+        return TABLET;
+      case 5:
+        return DESKTOP;
+      case 6:
+        return TV;
+      default:
+        return null;
+    }
+  }
+
+  static DeviceInfoDeviceType decode(bindings.Decoder decoder0, int offset) {
+    int v = decoder0.decodeUint32(offset);
+    DeviceInfoDeviceType result = new DeviceInfoDeviceType(v);
+    if (result == null) {
+      throw new bindings.MojoCodecError(
+          'Bad value $v for enum DeviceInfoDeviceType.');
+    }
+    return result;
+  }
+
+  String toString() {
+    switch(this) {
+      case UNKNOWN:
+        return 'DeviceInfoDeviceType.UNKNOWN';
+      case HEADLESS:
+        return 'DeviceInfoDeviceType.HEADLESS';
+      case WATCH:
+        return 'DeviceInfoDeviceType.WATCH';
+      case PHONE:
+        return 'DeviceInfoDeviceType.PHONE';
+      case TABLET:
+        return 'DeviceInfoDeviceType.TABLET';
+      case DESKTOP:
+        return 'DeviceInfoDeviceType.DESKTOP';
+      case TV:
+        return 'DeviceInfoDeviceType.TV';
+    }
+  }
+
+  int toJson() => value;
+}
+
+abstract class DeviceInfo {
+  dynamic getDeviceType([Function responseFactory = null]);
+
+}
+
+
+class DeviceInfoProxyImpl extends bindings.Proxy {
+  DeviceInfoProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  DeviceInfoProxyImpl.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);
+  }
+
+  String get name => DeviceInfoName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      case kDeviceInfo_getDeviceType_name:
+        var r = DeviceInfoGetDeviceTypeResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "DeviceInfoProxyImpl($superString)";
+  }
+}
+
+
+class _DeviceInfoProxyCalls implements DeviceInfo {
+  DeviceInfoProxyImpl _proxyImpl;
+
+  _DeviceInfoProxyCalls(this._proxyImpl);
+    dynamic getDeviceType([Function responseFactory = null]) {
+      var params = new DeviceInfoGetDeviceTypeParams();
+      return _proxyImpl.sendMessageWithRequestId(
+          params,
+          kDeviceInfo_getDeviceType_name,
+          -1,
+          bindings.MessageHeader.kMessageExpectsResponse);
+    }
+}
+
+
+class DeviceInfoProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  DeviceInfo ptr;
+  final String name = DeviceInfoName;
+
+  DeviceInfoProxy(DeviceInfoProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _DeviceInfoProxyCalls(proxyImpl);
+
+  DeviceInfoProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new DeviceInfoProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _DeviceInfoProxyCalls(impl);
+  }
+
+  DeviceInfoProxy.fromHandle(core.MojoHandle handle) :
+      impl = new DeviceInfoProxyImpl.fromHandle(handle) {
+    ptr = new _DeviceInfoProxyCalls(impl);
+  }
+
+  DeviceInfoProxy.unbound() :
+      impl = new DeviceInfoProxyImpl.unbound() {
+    ptr = new _DeviceInfoProxyCalls(impl);
+  }
+
+  factory DeviceInfoProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    DeviceInfoProxy p = new DeviceInfoProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static DeviceInfoProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For DeviceInfoProxy"));
+    return new DeviceInfoProxy.fromEndpoint(endpoint);
+  }
+
+  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)";
+  }
+}
+
+
+class DeviceInfoStub extends bindings.Stub {
+  DeviceInfo _impl = null;
+
+  DeviceInfoStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  DeviceInfoStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  DeviceInfoStub.unbound() : super.unbound();
+
+  static DeviceInfoStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For DeviceInfoStub"));
+    return new DeviceInfoStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = DeviceInfoName;
+
+
+  DeviceInfoGetDeviceTypeResponseParams _DeviceInfoGetDeviceTypeResponseParamsFactory(DeviceInfoDeviceType deviceType) {
+    var result = new DeviceInfoGetDeviceTypeResponseParams();
+    result.deviceType = deviceType;
+    return result;
+  }
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      case kDeviceInfo_getDeviceType_name:
+        var params = DeviceInfoGetDeviceTypeParams.deserialize(
+            message.payload);
+        var response = _impl.getDeviceType(_DeviceInfoGetDeviceTypeResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kDeviceInfo_getDeviceType_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kDeviceInfo_getDeviceType_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  DeviceInfo get impl => _impl;
+  set impl(DeviceInfo d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "DeviceInfoStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/display.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/display.mojom.dart
new file mode 100644
index 0000000..23e5359
--- /dev/null
+++ b/mojo/dart/packages/mojo_services/lib/mojo/display.mojom.dart
@@ -0,0 +1,616 @@
+// 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.
+
+library display_mojom;
+
+import 'dart:async';
+
+import 'package:mojo/bindings.dart' as bindings;
+import 'package:mojo/core.dart' as core;
+import 'package:mojo_services/mojo/context_provider.mojom.dart' as context_provider_mojom;
+import 'package:mojo_services/mojo/viewport_parameter_listener.mojom.dart' as viewport_parameter_listener_mojom;
+import 'package:mojo_services/mojo/surfaces.mojom.dart' as surfaces_mojom;
+
+
+
+class DisplaySubmitFrameParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  surfaces_mojom.Frame frame = null;
+
+  DisplaySubmitFrameParams() : super(kVersions.last.size);
+
+  static DisplaySubmitFrameParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static DisplaySubmitFrameParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    DisplaySubmitFrameParams result = new DisplaySubmitFrameParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, false);
+      result.frame = surfaces_mojom.Frame.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(frame, 8, false);
+  }
+
+  String toString() {
+    return "DisplaySubmitFrameParams("
+           "frame: $frame" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["frame"] = frame;
+    return map;
+  }
+}
+
+
+class DisplaySubmitFrameResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(8, 0)
+  ];
+
+  DisplaySubmitFrameResponseParams() : super(kVersions.last.size);
+
+  static DisplaySubmitFrameResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static DisplaySubmitFrameResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    DisplaySubmitFrameResponseParams result = new DisplaySubmitFrameResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    encoder.getStructEncoderAtOffset(kVersions.last);
+  }
+
+  String toString() {
+    return "DisplaySubmitFrameResponseParams("")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    return map;
+  }
+}
+
+
+class DisplayFactoryCreateParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(32, 0)
+  ];
+  Object contextProvider = null;
+  Object returner = null;
+  Object displayRequest = null;
+
+  DisplayFactoryCreateParams() : super(kVersions.last.size);
+
+  static DisplayFactoryCreateParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static DisplayFactoryCreateParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    DisplayFactoryCreateParams result = new DisplayFactoryCreateParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.contextProvider = decoder0.decodeServiceInterface(8, false, context_provider_mojom.ContextProviderProxy.newFromEndpoint);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.returner = decoder0.decodeServiceInterface(16, true, surfaces_mojom.ResourceReturnerProxy.newFromEndpoint);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.displayRequest = decoder0.decodeInterfaceRequest(24, false, DisplayStub.newFromEndpoint);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeInterface(contextProvider, 8, false);
+    
+    encoder0.encodeInterface(returner, 16, true);
+    
+    encoder0.encodeInterfaceRequest(displayRequest, 24, false);
+  }
+
+  String toString() {
+    return "DisplayFactoryCreateParams("
+           "contextProvider: $contextProvider" ", "
+           "returner: $returner" ", "
+           "displayRequest: $displayRequest" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+const int kDisplay_submitFrame_name = 0;
+
+const String DisplayName =
+      'mojo::Display';
+
+abstract class Display {
+  dynamic submitFrame(surfaces_mojom.Frame frame,[Function responseFactory = null]);
+
+}
+
+
+class DisplayProxyImpl extends bindings.Proxy {
+  DisplayProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  DisplayProxyImpl.fromHandle(core.MojoHandle handle) :
+      super.fromHandle(handle);
+
+  DisplayProxyImpl.unbound() : super.unbound();
+
+  static DisplayProxyImpl newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For DisplayProxyImpl"));
+    return new DisplayProxyImpl.fromEndpoint(endpoint);
+  }
+
+  String get name => DisplayName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      case kDisplay_submitFrame_name:
+        var r = DisplaySubmitFrameResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "DisplayProxyImpl($superString)";
+  }
+}
+
+
+class _DisplayProxyCalls implements Display {
+  DisplayProxyImpl _proxyImpl;
+
+  _DisplayProxyCalls(this._proxyImpl);
+    dynamic submitFrame(surfaces_mojom.Frame frame,[Function responseFactory = null]) {
+      var params = new DisplaySubmitFrameParams();
+      params.frame = frame;
+      return _proxyImpl.sendMessageWithRequestId(
+          params,
+          kDisplay_submitFrame_name,
+          -1,
+          bindings.MessageHeader.kMessageExpectsResponse);
+    }
+}
+
+
+class DisplayProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  Display ptr;
+  final String name = DisplayName;
+
+  DisplayProxy(DisplayProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _DisplayProxyCalls(proxyImpl);
+
+  DisplayProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new DisplayProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _DisplayProxyCalls(impl);
+  }
+
+  DisplayProxy.fromHandle(core.MojoHandle handle) :
+      impl = new DisplayProxyImpl.fromHandle(handle) {
+    ptr = new _DisplayProxyCalls(impl);
+  }
+
+  DisplayProxy.unbound() :
+      impl = new DisplayProxyImpl.unbound() {
+    ptr = new _DisplayProxyCalls(impl);
+  }
+
+  factory DisplayProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    DisplayProxy p = new DisplayProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static DisplayProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For DisplayProxy"));
+    return new DisplayProxy.fromEndpoint(endpoint);
+  }
+
+  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 "DisplayProxy($impl)";
+  }
+}
+
+
+class DisplayStub extends bindings.Stub {
+  Display _impl = null;
+
+  DisplayStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  DisplayStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  DisplayStub.unbound() : super.unbound();
+
+  static DisplayStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For DisplayStub"));
+    return new DisplayStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = DisplayName;
+
+
+  DisplaySubmitFrameResponseParams _DisplaySubmitFrameResponseParamsFactory() {
+    var result = new DisplaySubmitFrameResponseParams();
+    return result;
+  }
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      case kDisplay_submitFrame_name:
+        var params = DisplaySubmitFrameParams.deserialize(
+            message.payload);
+        var response = _impl.submitFrame(params.frame,_DisplaySubmitFrameResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kDisplay_submitFrame_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kDisplay_submitFrame_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  Display get impl => _impl;
+  set impl(Display d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "DisplayStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+const int kDisplayFactory_create_name = 0;
+
+const String DisplayFactoryName =
+      'mojo::DisplayFactory';
+
+abstract class DisplayFactory {
+  void create(Object contextProvider, Object returner, Object displayRequest);
+
+}
+
+
+class DisplayFactoryProxyImpl extends bindings.Proxy {
+  DisplayFactoryProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  DisplayFactoryProxyImpl.fromHandle(core.MojoHandle handle) :
+      super.fromHandle(handle);
+
+  DisplayFactoryProxyImpl.unbound() : super.unbound();
+
+  static DisplayFactoryProxyImpl newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For DisplayFactoryProxyImpl"));
+    return new DisplayFactoryProxyImpl.fromEndpoint(endpoint);
+  }
+
+  String get name => DisplayFactoryName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "DisplayFactoryProxyImpl($superString)";
+  }
+}
+
+
+class _DisplayFactoryProxyCalls implements DisplayFactory {
+  DisplayFactoryProxyImpl _proxyImpl;
+
+  _DisplayFactoryProxyCalls(this._proxyImpl);
+    void create(Object contextProvider, Object returner, Object displayRequest) {
+      if (!_proxyImpl.isBound) {
+        _proxyImpl.proxyError("The Proxy is closed.");
+        return;
+      }
+      var params = new DisplayFactoryCreateParams();
+      params.contextProvider = contextProvider;
+      params.returner = returner;
+      params.displayRequest = displayRequest;
+      _proxyImpl.sendMessage(params, kDisplayFactory_create_name);
+    }
+  
+}
+
+
+class DisplayFactoryProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  DisplayFactory ptr;
+  final String name = DisplayFactoryName;
+
+  DisplayFactoryProxy(DisplayFactoryProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _DisplayFactoryProxyCalls(proxyImpl);
+
+  DisplayFactoryProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new DisplayFactoryProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _DisplayFactoryProxyCalls(impl);
+  }
+
+  DisplayFactoryProxy.fromHandle(core.MojoHandle handle) :
+      impl = new DisplayFactoryProxyImpl.fromHandle(handle) {
+    ptr = new _DisplayFactoryProxyCalls(impl);
+  }
+
+  DisplayFactoryProxy.unbound() :
+      impl = new DisplayFactoryProxyImpl.unbound() {
+    ptr = new _DisplayFactoryProxyCalls(impl);
+  }
+
+  factory DisplayFactoryProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    DisplayFactoryProxy p = new DisplayFactoryProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static DisplayFactoryProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For DisplayFactoryProxy"));
+    return new DisplayFactoryProxy.fromEndpoint(endpoint);
+  }
+
+  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 "DisplayFactoryProxy($impl)";
+  }
+}
+
+
+class DisplayFactoryStub extends bindings.Stub {
+  DisplayFactory _impl = null;
+
+  DisplayFactoryStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  DisplayFactoryStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  DisplayFactoryStub.unbound() : super.unbound();
+
+  static DisplayFactoryStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For DisplayFactoryStub"));
+    return new DisplayFactoryStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = DisplayFactoryName;
+
+
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      case kDisplayFactory_create_name:
+        var params = DisplayFactoryCreateParams.deserialize(
+            message.payload);
+        _impl.create(params.contextProvider, params.returner, params.displayRequest);
+        break;
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  DisplayFactory get impl => _impl;
+  set impl(DisplayFactory d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "DisplayFactoryStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+
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
new file mode 100644
index 0000000..bdf481a
--- /dev/null
+++ b/mojo/dart/packages/mojo_services/lib/mojo/files/directory.mojom.dart
@@ -0,0 +1,1631 @@
+// 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.
+
+library directory_mojom;
+
+import 'dart:async';
+
+import 'package:mojo/bindings.dart' as bindings;
+import 'package:mojo/core.dart' as core;
+import 'package:mojo_services/mojo/files/file.mojom.dart' as file_mojom;
+import 'package:mojo_services/mojo/files/types.mojom.dart' as types_mojom;
+
+
+
+class DirectoryReadParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(8, 0)
+  ];
+
+  DirectoryReadParams() : super(kVersions.last.size);
+
+  static DirectoryReadParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static DirectoryReadParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    DirectoryReadParams result = new DirectoryReadParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    encoder.getStructEncoderAtOffset(kVersions.last);
+  }
+
+  String toString() {
+    return "DirectoryReadParams("")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    return map;
+  }
+}
+
+
+class DirectoryReadResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  types_mojom.Error error = null;
+  List<types_mojom.DirectoryEntry> directoryContents = null;
+
+  DirectoryReadResponseParams() : super(kVersions.last.size);
+
+  static DirectoryReadResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static DirectoryReadResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    DirectoryReadResponseParams result = new DirectoryReadResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+        result.error = types_mojom.Error.decode(decoder0, 8);
+        if (result.error == null) {
+          throw new bindings.MojoCodecError(
+            'Trying to decode null union for non-nullable types_mojom.Error.');
+        }
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(16, true);
+      if (decoder1 == null) {
+        result.directoryContents = null;
+      } else {
+        var si1 = decoder1.decodeDataHeaderForPointerArray(bindings.kUnspecifiedArrayLength);
+        result.directoryContents = new List<types_mojom.DirectoryEntry>(si1.numElements);
+        for (int i1 = 0; i1 < si1.numElements; ++i1) {
+          
+          var decoder2 = decoder1.decodePointer(bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i1, false);
+          result.directoryContents[i1] = types_mojom.DirectoryEntry.decode(decoder2);
+        }
+      }
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeEnum(error, 8);
+    
+    if (directoryContents == null) {
+      encoder0.encodeNullPointer(16, true);
+    } else {
+      var encoder1 = encoder0.encodePointerArray(directoryContents.length, 16, bindings.kUnspecifiedArrayLength);
+      for (int i0 = 0; i0 < directoryContents.length; ++i0) {
+        
+        encoder1.encodeStruct(directoryContents[i0], bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i0, false);
+      }
+    }
+  }
+
+  String toString() {
+    return "DirectoryReadResponseParams("
+           "error: $error" ", "
+           "directoryContents: $directoryContents" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["error"] = error;
+    map["directoryContents"] = directoryContents;
+    return map;
+  }
+}
+
+
+class DirectoryStatParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(8, 0)
+  ];
+
+  DirectoryStatParams() : super(kVersions.last.size);
+
+  static DirectoryStatParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static DirectoryStatParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    DirectoryStatParams result = new DirectoryStatParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    encoder.getStructEncoderAtOffset(kVersions.last);
+  }
+
+  String toString() {
+    return "DirectoryStatParams("")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    return map;
+  }
+}
+
+
+class DirectoryStatResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  types_mojom.Error error = null;
+  types_mojom.FileInformation fileInformation = null;
+
+  DirectoryStatResponseParams() : super(kVersions.last.size);
+
+  static DirectoryStatResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static DirectoryStatResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    DirectoryStatResponseParams result = new DirectoryStatResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+        result.error = types_mojom.Error.decode(decoder0, 8);
+        if (result.error == null) {
+          throw new bindings.MojoCodecError(
+            'Trying to decode null union for non-nullable types_mojom.Error.');
+        }
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(16, true);
+      result.fileInformation = types_mojom.FileInformation.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeEnum(error, 8);
+    
+    encoder0.encodeStruct(fileInformation, 16, true);
+  }
+
+  String toString() {
+    return "DirectoryStatResponseParams("
+           "error: $error" ", "
+           "fileInformation: $fileInformation" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["error"] = error;
+    map["fileInformation"] = fileInformation;
+    return map;
+  }
+}
+
+
+class DirectoryTouchParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  types_mojom.TimespecOrNow atime = null;
+  types_mojom.TimespecOrNow mtime = null;
+
+  DirectoryTouchParams() : super(kVersions.last.size);
+
+  static DirectoryTouchParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static DirectoryTouchParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    DirectoryTouchParams result = new DirectoryTouchParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, true);
+      result.atime = types_mojom.TimespecOrNow.decode(decoder1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(16, true);
+      result.mtime = types_mojom.TimespecOrNow.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(atime, 8, true);
+    
+    encoder0.encodeStruct(mtime, 16, true);
+  }
+
+  String toString() {
+    return "DirectoryTouchParams("
+           "atime: $atime" ", "
+           "mtime: $mtime" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["atime"] = atime;
+    map["mtime"] = mtime;
+    return map;
+  }
+}
+
+
+class DirectoryTouchResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  types_mojom.Error error = null;
+
+  DirectoryTouchResponseParams() : super(kVersions.last.size);
+
+  static DirectoryTouchResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static DirectoryTouchResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    DirectoryTouchResponseParams result = new DirectoryTouchResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+        result.error = types_mojom.Error.decode(decoder0, 8);
+        if (result.error == null) {
+          throw new bindings.MojoCodecError(
+            'Trying to decode null union for non-nullable types_mojom.Error.');
+        }
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeEnum(error, 8);
+  }
+
+  String toString() {
+    return "DirectoryTouchResponseParams("
+           "error: $error" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["error"] = error;
+    return map;
+  }
+}
+
+
+class DirectoryOpenFileParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  String path = null;
+  Object file = null;
+  int openFlags = 0;
+
+  DirectoryOpenFileParams() : super(kVersions.last.size);
+
+  static DirectoryOpenFileParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static DirectoryOpenFileParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    DirectoryOpenFileParams result = new DirectoryOpenFileParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.path = decoder0.decodeString(8, false);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.file = decoder0.decodeInterfaceRequest(16, true, file_mojom.FileStub.newFromEndpoint);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.openFlags = decoder0.decodeUint32(20);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeString(path, 8, false);
+    
+    encoder0.encodeInterfaceRequest(file, 16, true);
+    
+    encoder0.encodeUint32(openFlags, 20);
+  }
+
+  String toString() {
+    return "DirectoryOpenFileParams("
+           "path: $path" ", "
+           "file: $file" ", "
+           "openFlags: $openFlags" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+
+class DirectoryOpenFileResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  types_mojom.Error error = null;
+
+  DirectoryOpenFileResponseParams() : super(kVersions.last.size);
+
+  static DirectoryOpenFileResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static DirectoryOpenFileResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    DirectoryOpenFileResponseParams result = new DirectoryOpenFileResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+        result.error = types_mojom.Error.decode(decoder0, 8);
+        if (result.error == null) {
+          throw new bindings.MojoCodecError(
+            'Trying to decode null union for non-nullable types_mojom.Error.');
+        }
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeEnum(error, 8);
+  }
+
+  String toString() {
+    return "DirectoryOpenFileResponseParams("
+           "error: $error" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["error"] = error;
+    return map;
+  }
+}
+
+
+class DirectoryOpenDirectoryParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  String path = null;
+  Object directory = null;
+  int openFlags = 0;
+
+  DirectoryOpenDirectoryParams() : super(kVersions.last.size);
+
+  static DirectoryOpenDirectoryParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static DirectoryOpenDirectoryParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    DirectoryOpenDirectoryParams result = new DirectoryOpenDirectoryParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.path = decoder0.decodeString(8, false);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.directory = decoder0.decodeInterfaceRequest(16, true, DirectoryStub.newFromEndpoint);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.openFlags = decoder0.decodeUint32(20);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeString(path, 8, false);
+    
+    encoder0.encodeInterfaceRequest(directory, 16, true);
+    
+    encoder0.encodeUint32(openFlags, 20);
+  }
+
+  String toString() {
+    return "DirectoryOpenDirectoryParams("
+           "path: $path" ", "
+           "directory: $directory" ", "
+           "openFlags: $openFlags" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+
+class DirectoryOpenDirectoryResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  types_mojom.Error error = null;
+
+  DirectoryOpenDirectoryResponseParams() : super(kVersions.last.size);
+
+  static DirectoryOpenDirectoryResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static DirectoryOpenDirectoryResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    DirectoryOpenDirectoryResponseParams result = new DirectoryOpenDirectoryResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+        result.error = types_mojom.Error.decode(decoder0, 8);
+        if (result.error == null) {
+          throw new bindings.MojoCodecError(
+            'Trying to decode null union for non-nullable types_mojom.Error.');
+        }
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeEnum(error, 8);
+  }
+
+  String toString() {
+    return "DirectoryOpenDirectoryResponseParams("
+           "error: $error" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["error"] = error;
+    return map;
+  }
+}
+
+
+class DirectoryRenameParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  String path = null;
+  String newPath = null;
+
+  DirectoryRenameParams() : super(kVersions.last.size);
+
+  static DirectoryRenameParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static DirectoryRenameParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    DirectoryRenameParams result = new DirectoryRenameParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.path = decoder0.decodeString(8, false);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.newPath = decoder0.decodeString(16, false);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeString(path, 8, false);
+    
+    encoder0.encodeString(newPath, 16, false);
+  }
+
+  String toString() {
+    return "DirectoryRenameParams("
+           "path: $path" ", "
+           "newPath: $newPath" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["path"] = path;
+    map["newPath"] = newPath;
+    return map;
+  }
+}
+
+
+class DirectoryRenameResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  types_mojom.Error error = null;
+
+  DirectoryRenameResponseParams() : super(kVersions.last.size);
+
+  static DirectoryRenameResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static DirectoryRenameResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    DirectoryRenameResponseParams result = new DirectoryRenameResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+        result.error = types_mojom.Error.decode(decoder0, 8);
+        if (result.error == null) {
+          throw new bindings.MojoCodecError(
+            'Trying to decode null union for non-nullable types_mojom.Error.');
+        }
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeEnum(error, 8);
+  }
+
+  String toString() {
+    return "DirectoryRenameResponseParams("
+           "error: $error" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["error"] = error;
+    return map;
+  }
+}
+
+
+class DirectoryDeleteParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  String path = null;
+  int deleteFlags = 0;
+
+  DirectoryDeleteParams() : super(kVersions.last.size);
+
+  static DirectoryDeleteParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static DirectoryDeleteParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    DirectoryDeleteParams result = new DirectoryDeleteParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.path = decoder0.decodeString(8, false);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.deleteFlags = decoder0.decodeUint32(16);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeString(path, 8, false);
+    
+    encoder0.encodeUint32(deleteFlags, 16);
+  }
+
+  String toString() {
+    return "DirectoryDeleteParams("
+           "path: $path" ", "
+           "deleteFlags: $deleteFlags" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["path"] = path;
+    map["deleteFlags"] = deleteFlags;
+    return map;
+  }
+}
+
+
+class DirectoryDeleteResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  types_mojom.Error error = null;
+
+  DirectoryDeleteResponseParams() : super(kVersions.last.size);
+
+  static DirectoryDeleteResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static DirectoryDeleteResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    DirectoryDeleteResponseParams result = new DirectoryDeleteResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+        result.error = types_mojom.Error.decode(decoder0, 8);
+        if (result.error == null) {
+          throw new bindings.MojoCodecError(
+            'Trying to decode null union for non-nullable types_mojom.Error.');
+        }
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeEnum(error, 8);
+  }
+
+  String toString() {
+    return "DirectoryDeleteResponseParams("
+           "error: $error" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["error"] = error;
+    return map;
+  }
+}
+
+const int kDirectory_read_name = 0;
+const int kDirectory_stat_name = 1;
+const int kDirectory_touch_name = 2;
+const int kDirectory_openFile_name = 3;
+const int kDirectory_openDirectory_name = 4;
+const int kDirectory_rename_name = 5;
+const int kDirectory_delete_name = 6;
+
+const String DirectoryName =
+      'mojo::files::Directory';
+
+abstract class Directory {
+  dynamic read([Function responseFactory = null]);
+  dynamic stat([Function responseFactory = null]);
+  dynamic touch(types_mojom.TimespecOrNow atime,types_mojom.TimespecOrNow mtime,[Function responseFactory = null]);
+  dynamic openFile(String path,Object file,int openFlags,[Function responseFactory = null]);
+  dynamic openDirectory(String path,Object directory,int openFlags,[Function responseFactory = null]);
+  dynamic rename(String path,String newPath,[Function responseFactory = null]);
+  dynamic delete(String path,int deleteFlags,[Function responseFactory = null]);
+
+}
+
+
+class DirectoryProxyImpl extends bindings.Proxy {
+  DirectoryProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  DirectoryProxyImpl.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);
+  }
+
+  String get name => DirectoryName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      case kDirectory_read_name:
+        var r = DirectoryReadResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      case kDirectory_stat_name:
+        var r = DirectoryStatResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      case kDirectory_touch_name:
+        var r = DirectoryTouchResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      case kDirectory_openFile_name:
+        var r = DirectoryOpenFileResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      case kDirectory_openDirectory_name:
+        var r = DirectoryOpenDirectoryResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      case kDirectory_rename_name:
+        var r = DirectoryRenameResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      case kDirectory_delete_name:
+        var r = DirectoryDeleteResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "DirectoryProxyImpl($superString)";
+  }
+}
+
+
+class _DirectoryProxyCalls implements Directory {
+  DirectoryProxyImpl _proxyImpl;
+
+  _DirectoryProxyCalls(this._proxyImpl);
+    dynamic read([Function responseFactory = null]) {
+      var params = new DirectoryReadParams();
+      return _proxyImpl.sendMessageWithRequestId(
+          params,
+          kDirectory_read_name,
+          -1,
+          bindings.MessageHeader.kMessageExpectsResponse);
+    }
+    dynamic stat([Function responseFactory = null]) {
+      var params = new DirectoryStatParams();
+      return _proxyImpl.sendMessageWithRequestId(
+          params,
+          kDirectory_stat_name,
+          -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,
+          kDirectory_touch_name,
+          -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,
+          kDirectory_openFile_name,
+          -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,
+          kDirectory_openDirectory_name,
+          -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,
+          kDirectory_rename_name,
+          -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,
+          kDirectory_delete_name,
+          -1,
+          bindings.MessageHeader.kMessageExpectsResponse);
+    }
+}
+
+
+class DirectoryProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  Directory ptr;
+  final String name = DirectoryName;
+
+  DirectoryProxy(DirectoryProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _DirectoryProxyCalls(proxyImpl);
+
+  DirectoryProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new DirectoryProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _DirectoryProxyCalls(impl);
+  }
+
+  DirectoryProxy.fromHandle(core.MojoHandle handle) :
+      impl = new DirectoryProxyImpl.fromHandle(handle) {
+    ptr = new _DirectoryProxyCalls(impl);
+  }
+
+  DirectoryProxy.unbound() :
+      impl = new DirectoryProxyImpl.unbound() {
+    ptr = new _DirectoryProxyCalls(impl);
+  }
+
+  factory DirectoryProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    DirectoryProxy p = new DirectoryProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static DirectoryProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For DirectoryProxy"));
+    return new DirectoryProxy.fromEndpoint(endpoint);
+  }
+
+  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 "DirectoryProxy($impl)";
+  }
+}
+
+
+class DirectoryStub extends bindings.Stub {
+  Directory _impl = null;
+
+  DirectoryStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  DirectoryStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  DirectoryStub.unbound() : super.unbound();
+
+  static DirectoryStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For DirectoryStub"));
+    return new DirectoryStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = DirectoryName;
+
+
+  DirectoryReadResponseParams _DirectoryReadResponseParamsFactory(types_mojom.Error error, List<types_mojom.DirectoryEntry> directoryContents) {
+    var result = new DirectoryReadResponseParams();
+    result.error = error;
+    result.directoryContents = directoryContents;
+    return result;
+  }
+  DirectoryStatResponseParams _DirectoryStatResponseParamsFactory(types_mojom.Error error, types_mojom.FileInformation fileInformation) {
+    var result = new DirectoryStatResponseParams();
+    result.error = error;
+    result.fileInformation = fileInformation;
+    return result;
+  }
+  DirectoryTouchResponseParams _DirectoryTouchResponseParamsFactory(types_mojom.Error error) {
+    var result = new DirectoryTouchResponseParams();
+    result.error = error;
+    return result;
+  }
+  DirectoryOpenFileResponseParams _DirectoryOpenFileResponseParamsFactory(types_mojom.Error error) {
+    var result = new DirectoryOpenFileResponseParams();
+    result.error = error;
+    return result;
+  }
+  DirectoryOpenDirectoryResponseParams _DirectoryOpenDirectoryResponseParamsFactory(types_mojom.Error error) {
+    var result = new DirectoryOpenDirectoryResponseParams();
+    result.error = error;
+    return result;
+  }
+  DirectoryRenameResponseParams _DirectoryRenameResponseParamsFactory(types_mojom.Error error) {
+    var result = new DirectoryRenameResponseParams();
+    result.error = error;
+    return result;
+  }
+  DirectoryDeleteResponseParams _DirectoryDeleteResponseParamsFactory(types_mojom.Error error) {
+    var result = new DirectoryDeleteResponseParams();
+    result.error = error;
+    return result;
+  }
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      case kDirectory_read_name:
+        var params = DirectoryReadParams.deserialize(
+            message.payload);
+        var response = _impl.read(_DirectoryReadResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kDirectory_read_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kDirectory_read_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      case kDirectory_stat_name:
+        var params = DirectoryStatParams.deserialize(
+            message.payload);
+        var response = _impl.stat(_DirectoryStatResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kDirectory_stat_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kDirectory_stat_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      case kDirectory_touch_name:
+        var params = DirectoryTouchParams.deserialize(
+            message.payload);
+        var response = _impl.touch(params.atime,params.mtime,_DirectoryTouchResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kDirectory_touch_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kDirectory_touch_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      case kDirectory_openFile_name:
+        var params = DirectoryOpenFileParams.deserialize(
+            message.payload);
+        var response = _impl.openFile(params.path,params.file,params.openFlags,_DirectoryOpenFileResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kDirectory_openFile_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kDirectory_openFile_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      case kDirectory_openDirectory_name:
+        var params = DirectoryOpenDirectoryParams.deserialize(
+            message.payload);
+        var response = _impl.openDirectory(params.path,params.directory,params.openFlags,_DirectoryOpenDirectoryResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kDirectory_openDirectory_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kDirectory_openDirectory_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      case kDirectory_rename_name:
+        var params = DirectoryRenameParams.deserialize(
+            message.payload);
+        var response = _impl.rename(params.path,params.newPath,_DirectoryRenameResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kDirectory_rename_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kDirectory_rename_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      case kDirectory_delete_name:
+        var params = DirectoryDeleteParams.deserialize(
+            message.payload);
+        var response = _impl.delete(params.path,params.deleteFlags,_DirectoryDeleteResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kDirectory_delete_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kDirectory_delete_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  Directory get impl => _impl;
+  set impl(Directory d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "DirectoryStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+
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
new file mode 100644
index 0000000..b62a2eb
--- /dev/null
+++ b/mojo/dart/packages/mojo_services/lib/mojo/files/file.mojom.dart
@@ -0,0 +1,3087 @@
+// 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.
+
+library file_mojom;
+
+import 'dart:async';
+
+import 'package:mojo/bindings.dart' as bindings;
+import 'package:mojo/core.dart' as core;
+import 'package:mojo_services/mojo/files/types.mojom.dart' as types_mojom;
+
+
+
+class FileCloseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(8, 0)
+  ];
+
+  FileCloseParams() : super(kVersions.last.size);
+
+  static FileCloseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static FileCloseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    FileCloseParams result = new FileCloseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    encoder.getStructEncoderAtOffset(kVersions.last);
+  }
+
+  String toString() {
+    return "FileCloseParams("")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    return map;
+  }
+}
+
+
+class FileCloseResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  types_mojom.Error err = null;
+
+  FileCloseResponseParams() : super(kVersions.last.size);
+
+  static FileCloseResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static FileCloseResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    FileCloseResponseParams result = new FileCloseResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+        result.err = types_mojom.Error.decode(decoder0, 8);
+        if (result.err == null) {
+          throw new bindings.MojoCodecError(
+            'Trying to decode null union for non-nullable types_mojom.Error.');
+        }
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeEnum(err, 8);
+  }
+
+  String toString() {
+    return "FileCloseResponseParams("
+           "err: $err" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["err"] = err;
+    return map;
+  }
+}
+
+
+class FileReadParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  int numBytesToRead = 0;
+  types_mojom.Whence whence = null;
+  int offset = 0;
+
+  FileReadParams() : super(kVersions.last.size);
+
+  static FileReadParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static FileReadParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    FileReadParams result = new FileReadParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.numBytesToRead = decoder0.decodeUint32(8);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+        result.whence = types_mojom.Whence.decode(decoder0, 12);
+        if (result.whence == null) {
+          throw new bindings.MojoCodecError(
+            'Trying to decode null union for non-nullable types_mojom.Whence.');
+        }
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.offset = decoder0.decodeInt64(16);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeUint32(numBytesToRead, 8);
+    
+    encoder0.encodeEnum(whence, 12);
+    
+    encoder0.encodeInt64(offset, 16);
+  }
+
+  String toString() {
+    return "FileReadParams("
+           "numBytesToRead: $numBytesToRead" ", "
+           "whence: $whence" ", "
+           "offset: $offset" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["numBytesToRead"] = numBytesToRead;
+    map["whence"] = whence;
+    map["offset"] = offset;
+    return map;
+  }
+}
+
+
+class FileReadResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  types_mojom.Error error = null;
+  List<int> bytesRead = null;
+
+  FileReadResponseParams() : super(kVersions.last.size);
+
+  static FileReadResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static FileReadResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    FileReadResponseParams result = new FileReadResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+        result.error = types_mojom.Error.decode(decoder0, 8);
+        if (result.error == null) {
+          throw new bindings.MojoCodecError(
+            'Trying to decode null union for non-nullable types_mojom.Error.');
+        }
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.bytesRead = decoder0.decodeUint8Array(16, bindings.kArrayNullable, bindings.kUnspecifiedArrayLength);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeEnum(error, 8);
+    
+    encoder0.encodeUint8Array(bytesRead, 16, bindings.kArrayNullable, bindings.kUnspecifiedArrayLength);
+  }
+
+  String toString() {
+    return "FileReadResponseParams("
+           "error: $error" ", "
+           "bytesRead: $bytesRead" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["error"] = error;
+    map["bytesRead"] = bytesRead;
+    return map;
+  }
+}
+
+
+class FileWriteParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(32, 0)
+  ];
+  List<int> bytesToWrite = null;
+  int offset = 0;
+  types_mojom.Whence whence = null;
+
+  FileWriteParams() : super(kVersions.last.size);
+
+  static FileWriteParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static FileWriteParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    FileWriteParams result = new FileWriteParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.bytesToWrite = decoder0.decodeUint8Array(8, bindings.kNothingNullable, bindings.kUnspecifiedArrayLength);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.offset = decoder0.decodeInt64(16);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+        result.whence = types_mojom.Whence.decode(decoder0, 24);
+        if (result.whence == null) {
+          throw new bindings.MojoCodecError(
+            'Trying to decode null union for non-nullable types_mojom.Whence.');
+        }
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeUint8Array(bytesToWrite, 8, bindings.kNothingNullable, bindings.kUnspecifiedArrayLength);
+    
+    encoder0.encodeInt64(offset, 16);
+    
+    encoder0.encodeEnum(whence, 24);
+  }
+
+  String toString() {
+    return "FileWriteParams("
+           "bytesToWrite: $bytesToWrite" ", "
+           "offset: $offset" ", "
+           "whence: $whence" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["bytesToWrite"] = bytesToWrite;
+    map["offset"] = offset;
+    map["whence"] = whence;
+    return map;
+  }
+}
+
+
+class FileWriteResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  types_mojom.Error error = null;
+  int numBytesWritten = 0;
+
+  FileWriteResponseParams() : super(kVersions.last.size);
+
+  static FileWriteResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static FileWriteResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    FileWriteResponseParams result = new FileWriteResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+        result.error = types_mojom.Error.decode(decoder0, 8);
+        if (result.error == null) {
+          throw new bindings.MojoCodecError(
+            'Trying to decode null union for non-nullable types_mojom.Error.');
+        }
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.numBytesWritten = decoder0.decodeUint32(12);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeEnum(error, 8);
+    
+    encoder0.encodeUint32(numBytesWritten, 12);
+  }
+
+  String toString() {
+    return "FileWriteResponseParams("
+           "error: $error" ", "
+           "numBytesWritten: $numBytesWritten" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["error"] = error;
+    map["numBytesWritten"] = numBytesWritten;
+    return map;
+  }
+}
+
+
+class FileReadToStreamParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(32, 0)
+  ];
+  core.MojoDataPipeProducer source = null;
+  types_mojom.Whence whence = null;
+  int offset = 0;
+  int numBytesToRead = 0;
+
+  FileReadToStreamParams() : super(kVersions.last.size);
+
+  static FileReadToStreamParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static FileReadToStreamParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    FileReadToStreamParams result = new FileReadToStreamParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.source = decoder0.decodeProducerHandle(8, false);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+        result.whence = types_mojom.Whence.decode(decoder0, 12);
+        if (result.whence == null) {
+          throw new bindings.MojoCodecError(
+            'Trying to decode null union for non-nullable types_mojom.Whence.');
+        }
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.offset = decoder0.decodeInt64(16);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.numBytesToRead = decoder0.decodeInt64(24);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeProducerHandle(source, 8, false);
+    
+    encoder0.encodeEnum(whence, 12);
+    
+    encoder0.encodeInt64(offset, 16);
+    
+    encoder0.encodeInt64(numBytesToRead, 24);
+  }
+
+  String toString() {
+    return "FileReadToStreamParams("
+           "source: $source" ", "
+           "whence: $whence" ", "
+           "offset: $offset" ", "
+           "numBytesToRead: $numBytesToRead" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+
+class FileReadToStreamResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  types_mojom.Error error = null;
+
+  FileReadToStreamResponseParams() : super(kVersions.last.size);
+
+  static FileReadToStreamResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static FileReadToStreamResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    FileReadToStreamResponseParams result = new FileReadToStreamResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+        result.error = types_mojom.Error.decode(decoder0, 8);
+        if (result.error == null) {
+          throw new bindings.MojoCodecError(
+            'Trying to decode null union for non-nullable types_mojom.Error.');
+        }
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeEnum(error, 8);
+  }
+
+  String toString() {
+    return "FileReadToStreamResponseParams("
+           "error: $error" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["error"] = error;
+    return map;
+  }
+}
+
+
+class FileWriteFromStreamParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  core.MojoDataPipeConsumer sink = null;
+  types_mojom.Whence whence = null;
+  int offset = 0;
+
+  FileWriteFromStreamParams() : super(kVersions.last.size);
+
+  static FileWriteFromStreamParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static FileWriteFromStreamParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    FileWriteFromStreamParams result = new FileWriteFromStreamParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.sink = decoder0.decodeConsumerHandle(8, false);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+        result.whence = types_mojom.Whence.decode(decoder0, 12);
+        if (result.whence == null) {
+          throw new bindings.MojoCodecError(
+            'Trying to decode null union for non-nullable types_mojom.Whence.');
+        }
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.offset = decoder0.decodeInt64(16);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeConsumerHandle(sink, 8, false);
+    
+    encoder0.encodeEnum(whence, 12);
+    
+    encoder0.encodeInt64(offset, 16);
+  }
+
+  String toString() {
+    return "FileWriteFromStreamParams("
+           "sink: $sink" ", "
+           "whence: $whence" ", "
+           "offset: $offset" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+
+class FileWriteFromStreamResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  types_mojom.Error error = null;
+
+  FileWriteFromStreamResponseParams() : super(kVersions.last.size);
+
+  static FileWriteFromStreamResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static FileWriteFromStreamResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    FileWriteFromStreamResponseParams result = new FileWriteFromStreamResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+        result.error = types_mojom.Error.decode(decoder0, 8);
+        if (result.error == null) {
+          throw new bindings.MojoCodecError(
+            'Trying to decode null union for non-nullable types_mojom.Error.');
+        }
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeEnum(error, 8);
+  }
+
+  String toString() {
+    return "FileWriteFromStreamResponseParams("
+           "error: $error" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["error"] = error;
+    return map;
+  }
+}
+
+
+class FileTellParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(8, 0)
+  ];
+
+  FileTellParams() : super(kVersions.last.size);
+
+  static FileTellParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static FileTellParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    FileTellParams result = new FileTellParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    encoder.getStructEncoderAtOffset(kVersions.last);
+  }
+
+  String toString() {
+    return "FileTellParams("")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    return map;
+  }
+}
+
+
+class FileTellResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  types_mojom.Error error = null;
+  int position = 0;
+
+  FileTellResponseParams() : super(kVersions.last.size);
+
+  static FileTellResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static FileTellResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    FileTellResponseParams result = new FileTellResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+        result.error = types_mojom.Error.decode(decoder0, 8);
+        if (result.error == null) {
+          throw new bindings.MojoCodecError(
+            'Trying to decode null union for non-nullable types_mojom.Error.');
+        }
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.position = decoder0.decodeInt64(16);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeEnum(error, 8);
+    
+    encoder0.encodeInt64(position, 16);
+  }
+
+  String toString() {
+    return "FileTellResponseParams("
+           "error: $error" ", "
+           "position: $position" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["error"] = error;
+    map["position"] = position;
+    return map;
+  }
+}
+
+
+class FileSeekParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  int offset = 0;
+  types_mojom.Whence whence = null;
+
+  FileSeekParams() : super(kVersions.last.size);
+
+  static FileSeekParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static FileSeekParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    FileSeekParams result = new FileSeekParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.offset = decoder0.decodeInt64(8);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+        result.whence = types_mojom.Whence.decode(decoder0, 16);
+        if (result.whence == null) {
+          throw new bindings.MojoCodecError(
+            'Trying to decode null union for non-nullable types_mojom.Whence.');
+        }
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeInt64(offset, 8);
+    
+    encoder0.encodeEnum(whence, 16);
+  }
+
+  String toString() {
+    return "FileSeekParams("
+           "offset: $offset" ", "
+           "whence: $whence" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["offset"] = offset;
+    map["whence"] = whence;
+    return map;
+  }
+}
+
+
+class FileSeekResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  types_mojom.Error error = null;
+  int position = 0;
+
+  FileSeekResponseParams() : super(kVersions.last.size);
+
+  static FileSeekResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static FileSeekResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    FileSeekResponseParams result = new FileSeekResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+        result.error = types_mojom.Error.decode(decoder0, 8);
+        if (result.error == null) {
+          throw new bindings.MojoCodecError(
+            'Trying to decode null union for non-nullable types_mojom.Error.');
+        }
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.position = decoder0.decodeInt64(16);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeEnum(error, 8);
+    
+    encoder0.encodeInt64(position, 16);
+  }
+
+  String toString() {
+    return "FileSeekResponseParams("
+           "error: $error" ", "
+           "position: $position" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["error"] = error;
+    map["position"] = position;
+    return map;
+  }
+}
+
+
+class FileStatParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(8, 0)
+  ];
+
+  FileStatParams() : super(kVersions.last.size);
+
+  static FileStatParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static FileStatParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    FileStatParams result = new FileStatParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    encoder.getStructEncoderAtOffset(kVersions.last);
+  }
+
+  String toString() {
+    return "FileStatParams("")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    return map;
+  }
+}
+
+
+class FileStatResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  types_mojom.Error error = null;
+  types_mojom.FileInformation fileInformation = null;
+
+  FileStatResponseParams() : super(kVersions.last.size);
+
+  static FileStatResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static FileStatResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    FileStatResponseParams result = new FileStatResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+        result.error = types_mojom.Error.decode(decoder0, 8);
+        if (result.error == null) {
+          throw new bindings.MojoCodecError(
+            'Trying to decode null union for non-nullable types_mojom.Error.');
+        }
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(16, true);
+      result.fileInformation = types_mojom.FileInformation.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeEnum(error, 8);
+    
+    encoder0.encodeStruct(fileInformation, 16, true);
+  }
+
+  String toString() {
+    return "FileStatResponseParams("
+           "error: $error" ", "
+           "fileInformation: $fileInformation" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["error"] = error;
+    map["fileInformation"] = fileInformation;
+    return map;
+  }
+}
+
+
+class FileTruncateParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  int size = 0;
+
+  FileTruncateParams() : super(kVersions.last.size);
+
+  static FileTruncateParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static FileTruncateParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    FileTruncateParams result = new FileTruncateParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.size = decoder0.decodeInt64(8);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeInt64(size, 8);
+  }
+
+  String toString() {
+    return "FileTruncateParams("
+           "size: $size" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["size"] = size;
+    return map;
+  }
+}
+
+
+class FileTruncateResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  types_mojom.Error error = null;
+
+  FileTruncateResponseParams() : super(kVersions.last.size);
+
+  static FileTruncateResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static FileTruncateResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    FileTruncateResponseParams result = new FileTruncateResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+        result.error = types_mojom.Error.decode(decoder0, 8);
+        if (result.error == null) {
+          throw new bindings.MojoCodecError(
+            'Trying to decode null union for non-nullable types_mojom.Error.');
+        }
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeEnum(error, 8);
+  }
+
+  String toString() {
+    return "FileTruncateResponseParams("
+           "error: $error" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["error"] = error;
+    return map;
+  }
+}
+
+
+class FileTouchParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  types_mojom.TimespecOrNow atime = null;
+  types_mojom.TimespecOrNow mtime = null;
+
+  FileTouchParams() : super(kVersions.last.size);
+
+  static FileTouchParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static FileTouchParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    FileTouchParams result = new FileTouchParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, true);
+      result.atime = types_mojom.TimespecOrNow.decode(decoder1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(16, true);
+      result.mtime = types_mojom.TimespecOrNow.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(atime, 8, true);
+    
+    encoder0.encodeStruct(mtime, 16, true);
+  }
+
+  String toString() {
+    return "FileTouchParams("
+           "atime: $atime" ", "
+           "mtime: $mtime" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["atime"] = atime;
+    map["mtime"] = mtime;
+    return map;
+  }
+}
+
+
+class FileTouchResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  types_mojom.Error error = null;
+
+  FileTouchResponseParams() : super(kVersions.last.size);
+
+  static FileTouchResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static FileTouchResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    FileTouchResponseParams result = new FileTouchResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+        result.error = types_mojom.Error.decode(decoder0, 8);
+        if (result.error == null) {
+          throw new bindings.MojoCodecError(
+            'Trying to decode null union for non-nullable types_mojom.Error.');
+        }
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeEnum(error, 8);
+  }
+
+  String toString() {
+    return "FileTouchResponseParams("
+           "error: $error" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["error"] = error;
+    return map;
+  }
+}
+
+
+class FileDupParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  Object file = null;
+
+  FileDupParams() : super(kVersions.last.size);
+
+  static FileDupParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static FileDupParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    FileDupParams result = new FileDupParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.file = decoder0.decodeInterfaceRequest(8, false, FileStub.newFromEndpoint);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeInterfaceRequest(file, 8, false);
+  }
+
+  String toString() {
+    return "FileDupParams("
+           "file: $file" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+
+class FileDupResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  types_mojom.Error error = null;
+
+  FileDupResponseParams() : super(kVersions.last.size);
+
+  static FileDupResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static FileDupResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    FileDupResponseParams result = new FileDupResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+        result.error = types_mojom.Error.decode(decoder0, 8);
+        if (result.error == null) {
+          throw new bindings.MojoCodecError(
+            'Trying to decode null union for non-nullable types_mojom.Error.');
+        }
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeEnum(error, 8);
+  }
+
+  String toString() {
+    return "FileDupResponseParams("
+           "error: $error" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["error"] = error;
+    return map;
+  }
+}
+
+
+class FileReopenParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  Object file = null;
+  int openFlags = 0;
+
+  FileReopenParams() : super(kVersions.last.size);
+
+  static FileReopenParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static FileReopenParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    FileReopenParams result = new FileReopenParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.file = decoder0.decodeInterfaceRequest(8, false, FileStub.newFromEndpoint);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.openFlags = decoder0.decodeUint32(12);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeInterfaceRequest(file, 8, false);
+    
+    encoder0.encodeUint32(openFlags, 12);
+  }
+
+  String toString() {
+    return "FileReopenParams("
+           "file: $file" ", "
+           "openFlags: $openFlags" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+
+class FileReopenResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  types_mojom.Error error = null;
+
+  FileReopenResponseParams() : super(kVersions.last.size);
+
+  static FileReopenResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static FileReopenResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    FileReopenResponseParams result = new FileReopenResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+        result.error = types_mojom.Error.decode(decoder0, 8);
+        if (result.error == null) {
+          throw new bindings.MojoCodecError(
+            'Trying to decode null union for non-nullable types_mojom.Error.');
+        }
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeEnum(error, 8);
+  }
+
+  String toString() {
+    return "FileReopenResponseParams("
+           "error: $error" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["error"] = error;
+    return map;
+  }
+}
+
+
+class FileAsBufferParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(8, 0)
+  ];
+
+  FileAsBufferParams() : super(kVersions.last.size);
+
+  static FileAsBufferParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static FileAsBufferParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    FileAsBufferParams result = new FileAsBufferParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    encoder.getStructEncoderAtOffset(kVersions.last);
+  }
+
+  String toString() {
+    return "FileAsBufferParams("")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    return map;
+  }
+}
+
+
+class FileAsBufferResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  types_mojom.Error error = null;
+  core.MojoSharedBuffer buffer = null;
+
+  FileAsBufferResponseParams() : super(kVersions.last.size);
+
+  static FileAsBufferResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static FileAsBufferResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    FileAsBufferResponseParams result = new FileAsBufferResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+        result.error = types_mojom.Error.decode(decoder0, 8);
+        if (result.error == null) {
+          throw new bindings.MojoCodecError(
+            'Trying to decode null union for non-nullable types_mojom.Error.');
+        }
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.buffer = decoder0.decodeSharedBufferHandle(12, true);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeEnum(error, 8);
+    
+    encoder0.encodeSharedBufferHandle(buffer, 12, true);
+  }
+
+  String toString() {
+    return "FileAsBufferResponseParams("
+           "error: $error" ", "
+           "buffer: $buffer" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+
+class FileIoctlParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  int request = 0;
+  List<int> inValues = null;
+
+  FileIoctlParams() : super(kVersions.last.size);
+
+  static FileIoctlParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static FileIoctlParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    FileIoctlParams result = new FileIoctlParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.request = decoder0.decodeUint32(8);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.inValues = decoder0.decodeUint32Array(16, bindings.kArrayNullable, bindings.kUnspecifiedArrayLength);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeUint32(request, 8);
+    
+    encoder0.encodeUint32Array(inValues, 16, bindings.kArrayNullable, bindings.kUnspecifiedArrayLength);
+  }
+
+  String toString() {
+    return "FileIoctlParams("
+           "request: $request" ", "
+           "inValues: $inValues" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["request"] = request;
+    map["inValues"] = inValues;
+    return map;
+  }
+}
+
+
+class FileIoctlResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  types_mojom.Error error = null;
+  List<int> outValues = null;
+
+  FileIoctlResponseParams() : super(kVersions.last.size);
+
+  static FileIoctlResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static FileIoctlResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    FileIoctlResponseParams result = new FileIoctlResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+        result.error = types_mojom.Error.decode(decoder0, 8);
+        if (result.error == null) {
+          throw new bindings.MojoCodecError(
+            'Trying to decode null union for non-nullable types_mojom.Error.');
+        }
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.outValues = decoder0.decodeUint32Array(16, bindings.kArrayNullable, bindings.kUnspecifiedArrayLength);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeEnum(error, 8);
+    
+    encoder0.encodeUint32Array(outValues, 16, bindings.kArrayNullable, bindings.kUnspecifiedArrayLength);
+  }
+
+  String toString() {
+    return "FileIoctlResponseParams("
+           "error: $error" ", "
+           "outValues: $outValues" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["error"] = error;
+    map["outValues"] = outValues;
+    return map;
+  }
+}
+
+const int kFile_close_name = 0;
+const int kFile_read_name = 1;
+const int kFile_write_name = 2;
+const int kFile_readToStream_name = 3;
+const int kFile_writeFromStream_name = 4;
+const int kFile_tell_name = 5;
+const int kFile_seek_name = 6;
+const int kFile_stat_name = 7;
+const int kFile_truncate_name = 8;
+const int kFile_touch_name = 9;
+const int kFile_dup_name = 10;
+const int kFile_reopen_name = 11;
+const int kFile_asBuffer_name = 12;
+const int kFile_ioctl_name = 13;
+
+const String FileName =
+      'mojo::files::File';
+
+abstract class File {
+  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]);
+  dynamic writeFromStream(core.MojoDataPipeConsumer sink,int offset,types_mojom.Whence whence,[Function responseFactory = null]);
+  dynamic tell([Function responseFactory = null]);
+  dynamic seek(int offset,types_mojom.Whence whence,[Function responseFactory = null]);
+  dynamic stat([Function responseFactory = null]);
+  dynamic truncate(int size,[Function responseFactory = null]);
+  dynamic touch(types_mojom.TimespecOrNow atime,types_mojom.TimespecOrNow mtime,[Function responseFactory = null]);
+  dynamic dup(Object file,[Function responseFactory = null]);
+  dynamic reopen(Object file,int openFlags,[Function responseFactory = null]);
+  dynamic asBuffer([Function responseFactory = null]);
+  dynamic ioctl(int request,List<int> inValues,[Function responseFactory = null]);
+
+}
+
+
+class FileProxyImpl extends bindings.Proxy {
+  FileProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  FileProxyImpl.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);
+  }
+
+  String get name => FileName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      case kFile_close_name:
+        var r = FileCloseResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      case kFile_read_name:
+        var r = FileReadResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      case kFile_write_name:
+        var r = FileWriteResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      case kFile_readToStream_name:
+        var r = FileReadToStreamResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      case kFile_writeFromStream_name:
+        var r = FileWriteFromStreamResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      case kFile_tell_name:
+        var r = FileTellResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      case kFile_seek_name:
+        var r = FileSeekResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      case kFile_stat_name:
+        var r = FileStatResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      case kFile_truncate_name:
+        var r = FileTruncateResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      case kFile_touch_name:
+        var r = FileTouchResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      case kFile_dup_name:
+        var r = FileDupResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      case kFile_reopen_name:
+        var r = FileReopenResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      case kFile_asBuffer_name:
+        var r = FileAsBufferResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      case kFile_ioctl_name:
+        var r = FileIoctlResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "FileProxyImpl($superString)";
+  }
+}
+
+
+class _FileProxyCalls implements File {
+  FileProxyImpl _proxyImpl;
+
+  _FileProxyCalls(this._proxyImpl);
+    dynamic close([Function responseFactory = null]) {
+      var params = new FileCloseParams();
+      return _proxyImpl.sendMessageWithRequestId(
+          params,
+          kFile_close_name,
+          -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,
+          kFile_read_name,
+          -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,
+          kFile_write_name,
+          -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,
+          kFile_readToStream_name,
+          -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,
+          kFile_writeFromStream_name,
+          -1,
+          bindings.MessageHeader.kMessageExpectsResponse);
+    }
+    dynamic tell([Function responseFactory = null]) {
+      var params = new FileTellParams();
+      return _proxyImpl.sendMessageWithRequestId(
+          params,
+          kFile_tell_name,
+          -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,
+          kFile_seek_name,
+          -1,
+          bindings.MessageHeader.kMessageExpectsResponse);
+    }
+    dynamic stat([Function responseFactory = null]) {
+      var params = new FileStatParams();
+      return _proxyImpl.sendMessageWithRequestId(
+          params,
+          kFile_stat_name,
+          -1,
+          bindings.MessageHeader.kMessageExpectsResponse);
+    }
+    dynamic truncate(int size,[Function responseFactory = null]) {
+      var params = new FileTruncateParams();
+      params.size = size;
+      return _proxyImpl.sendMessageWithRequestId(
+          params,
+          kFile_truncate_name,
+          -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,
+          kFile_touch_name,
+          -1,
+          bindings.MessageHeader.kMessageExpectsResponse);
+    }
+    dynamic dup(Object file,[Function responseFactory = null]) {
+      var params = new FileDupParams();
+      params.file = file;
+      return _proxyImpl.sendMessageWithRequestId(
+          params,
+          kFile_dup_name,
+          -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,
+          kFile_reopen_name,
+          -1,
+          bindings.MessageHeader.kMessageExpectsResponse);
+    }
+    dynamic asBuffer([Function responseFactory = null]) {
+      var params = new FileAsBufferParams();
+      return _proxyImpl.sendMessageWithRequestId(
+          params,
+          kFile_asBuffer_name,
+          -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,
+          kFile_ioctl_name,
+          -1,
+          bindings.MessageHeader.kMessageExpectsResponse);
+    }
+}
+
+
+class FileProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  File ptr;
+  final String name = FileName;
+
+  FileProxy(FileProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _FileProxyCalls(proxyImpl);
+
+  FileProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new FileProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _FileProxyCalls(impl);
+  }
+
+  FileProxy.fromHandle(core.MojoHandle handle) :
+      impl = new FileProxyImpl.fromHandle(handle) {
+    ptr = new _FileProxyCalls(impl);
+  }
+
+  FileProxy.unbound() :
+      impl = new FileProxyImpl.unbound() {
+    ptr = new _FileProxyCalls(impl);
+  }
+
+  factory FileProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    FileProxy p = new FileProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static FileProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For FileProxy"));
+    return new FileProxy.fromEndpoint(endpoint);
+  }
+
+  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 "FileProxy($impl)";
+  }
+}
+
+
+class FileStub extends bindings.Stub {
+  File _impl = null;
+
+  FileStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  FileStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  FileStub.unbound() : super.unbound();
+
+  static FileStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For FileStub"));
+    return new FileStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = FileName;
+
+
+  FileCloseResponseParams _FileCloseResponseParamsFactory(types_mojom.Error err) {
+    var result = new FileCloseResponseParams();
+    result.err = err;
+    return result;
+  }
+  FileReadResponseParams _FileReadResponseParamsFactory(types_mojom.Error error, List<int> bytesRead) {
+    var result = new FileReadResponseParams();
+    result.error = error;
+    result.bytesRead = bytesRead;
+    return result;
+  }
+  FileWriteResponseParams _FileWriteResponseParamsFactory(types_mojom.Error error, int numBytesWritten) {
+    var result = new FileWriteResponseParams();
+    result.error = error;
+    result.numBytesWritten = numBytesWritten;
+    return result;
+  }
+  FileReadToStreamResponseParams _FileReadToStreamResponseParamsFactory(types_mojom.Error error) {
+    var result = new FileReadToStreamResponseParams();
+    result.error = error;
+    return result;
+  }
+  FileWriteFromStreamResponseParams _FileWriteFromStreamResponseParamsFactory(types_mojom.Error error) {
+    var result = new FileWriteFromStreamResponseParams();
+    result.error = error;
+    return result;
+  }
+  FileTellResponseParams _FileTellResponseParamsFactory(types_mojom.Error error, int position) {
+    var result = new FileTellResponseParams();
+    result.error = error;
+    result.position = position;
+    return result;
+  }
+  FileSeekResponseParams _FileSeekResponseParamsFactory(types_mojom.Error error, int position) {
+    var result = new FileSeekResponseParams();
+    result.error = error;
+    result.position = position;
+    return result;
+  }
+  FileStatResponseParams _FileStatResponseParamsFactory(types_mojom.Error error, types_mojom.FileInformation fileInformation) {
+    var result = new FileStatResponseParams();
+    result.error = error;
+    result.fileInformation = fileInformation;
+    return result;
+  }
+  FileTruncateResponseParams _FileTruncateResponseParamsFactory(types_mojom.Error error) {
+    var result = new FileTruncateResponseParams();
+    result.error = error;
+    return result;
+  }
+  FileTouchResponseParams _FileTouchResponseParamsFactory(types_mojom.Error error) {
+    var result = new FileTouchResponseParams();
+    result.error = error;
+    return result;
+  }
+  FileDupResponseParams _FileDupResponseParamsFactory(types_mojom.Error error) {
+    var result = new FileDupResponseParams();
+    result.error = error;
+    return result;
+  }
+  FileReopenResponseParams _FileReopenResponseParamsFactory(types_mojom.Error error) {
+    var result = new FileReopenResponseParams();
+    result.error = error;
+    return result;
+  }
+  FileAsBufferResponseParams _FileAsBufferResponseParamsFactory(types_mojom.Error error, core.MojoSharedBuffer buffer) {
+    var result = new FileAsBufferResponseParams();
+    result.error = error;
+    result.buffer = buffer;
+    return result;
+  }
+  FileIoctlResponseParams _FileIoctlResponseParamsFactory(types_mojom.Error error, List<int> outValues) {
+    var result = new FileIoctlResponseParams();
+    result.error = error;
+    result.outValues = outValues;
+    return result;
+  }
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      case kFile_close_name:
+        var params = FileCloseParams.deserialize(
+            message.payload);
+        var response = _impl.close(_FileCloseResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kFile_close_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kFile_close_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      case kFile_read_name:
+        var params = FileReadParams.deserialize(
+            message.payload);
+        var response = _impl.read(params.numBytesToRead,params.offset,params.whence,_FileReadResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kFile_read_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kFile_read_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      case kFile_write_name:
+        var params = FileWriteParams.deserialize(
+            message.payload);
+        var response = _impl.write(params.bytesToWrite,params.offset,params.whence,_FileWriteResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kFile_write_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kFile_write_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      case kFile_readToStream_name:
+        var params = FileReadToStreamParams.deserialize(
+            message.payload);
+        var response = _impl.readToStream(params.source,params.offset,params.whence,params.numBytesToRead,_FileReadToStreamResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kFile_readToStream_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kFile_readToStream_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      case kFile_writeFromStream_name:
+        var params = FileWriteFromStreamParams.deserialize(
+            message.payload);
+        var response = _impl.writeFromStream(params.sink,params.offset,params.whence,_FileWriteFromStreamResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kFile_writeFromStream_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kFile_writeFromStream_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      case kFile_tell_name:
+        var params = FileTellParams.deserialize(
+            message.payload);
+        var response = _impl.tell(_FileTellResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kFile_tell_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kFile_tell_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      case kFile_seek_name:
+        var params = FileSeekParams.deserialize(
+            message.payload);
+        var response = _impl.seek(params.offset,params.whence,_FileSeekResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kFile_seek_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kFile_seek_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      case kFile_stat_name:
+        var params = FileStatParams.deserialize(
+            message.payload);
+        var response = _impl.stat(_FileStatResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kFile_stat_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kFile_stat_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      case kFile_truncate_name:
+        var params = FileTruncateParams.deserialize(
+            message.payload);
+        var response = _impl.truncate(params.size,_FileTruncateResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kFile_truncate_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kFile_truncate_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      case kFile_touch_name:
+        var params = FileTouchParams.deserialize(
+            message.payload);
+        var response = _impl.touch(params.atime,params.mtime,_FileTouchResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kFile_touch_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kFile_touch_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      case kFile_dup_name:
+        var params = FileDupParams.deserialize(
+            message.payload);
+        var response = _impl.dup(params.file,_FileDupResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kFile_dup_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kFile_dup_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      case kFile_reopen_name:
+        var params = FileReopenParams.deserialize(
+            message.payload);
+        var response = _impl.reopen(params.file,params.openFlags,_FileReopenResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kFile_reopen_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kFile_reopen_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      case kFile_asBuffer_name:
+        var params = FileAsBufferParams.deserialize(
+            message.payload);
+        var response = _impl.asBuffer(_FileAsBufferResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kFile_asBuffer_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kFile_asBuffer_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      case kFile_ioctl_name:
+        var params = FileIoctlParams.deserialize(
+            message.payload);
+        var response = _impl.ioctl(params.request,params.inValues,_FileIoctlResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kFile_ioctl_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kFile_ioctl_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  File get impl => _impl;
+  set impl(File d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "FileStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+
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
new file mode 100644
index 0000000..f334180
--- /dev/null
+++ b/mojo/dart/packages/mojo_services/lib/mojo/files/files.mojom.dart
@@ -0,0 +1,377 @@
+// 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.
+
+library files_mojom;
+
+import 'dart:async';
+
+import 'package:mojo/bindings.dart' as bindings;
+import 'package:mojo/core.dart' as core;
+import 'package:mojo_services/mojo/files/directory.mojom.dart' as directory_mojom;
+import 'package:mojo_services/mojo/files/types.mojom.dart' as types_mojom;
+
+
+
+class FilesOpenFileSystemParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  String fileSystem = null;
+  Object directory = null;
+
+  FilesOpenFileSystemParams() : super(kVersions.last.size);
+
+  static FilesOpenFileSystemParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static FilesOpenFileSystemParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    FilesOpenFileSystemParams result = new FilesOpenFileSystemParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.fileSystem = decoder0.decodeString(8, true);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.directory = decoder0.decodeInterfaceRequest(16, false, directory_mojom.DirectoryStub.newFromEndpoint);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeString(fileSystem, 8, true);
+    
+    encoder0.encodeInterfaceRequest(directory, 16, false);
+  }
+
+  String toString() {
+    return "FilesOpenFileSystemParams("
+           "fileSystem: $fileSystem" ", "
+           "directory: $directory" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+
+class FilesOpenFileSystemResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  types_mojom.Error error = null;
+
+  FilesOpenFileSystemResponseParams() : super(kVersions.last.size);
+
+  static FilesOpenFileSystemResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static FilesOpenFileSystemResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    FilesOpenFileSystemResponseParams result = new FilesOpenFileSystemResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+        result.error = types_mojom.Error.decode(decoder0, 8);
+        if (result.error == null) {
+          throw new bindings.MojoCodecError(
+            'Trying to decode null union for non-nullable types_mojom.Error.');
+        }
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeEnum(error, 8);
+  }
+
+  String toString() {
+    return "FilesOpenFileSystemResponseParams("
+           "error: $error" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["error"] = error;
+    return map;
+  }
+}
+
+const int kFiles_openFileSystem_name = 0;
+
+const String FilesName =
+      'mojo::files::Files';
+
+abstract class Files {
+  dynamic openFileSystem(String fileSystem,Object directory,[Function responseFactory = null]);
+
+}
+
+
+class FilesProxyImpl extends bindings.Proxy {
+  FilesProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  FilesProxyImpl.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);
+  }
+
+  String get name => FilesName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      case kFiles_openFileSystem_name:
+        var r = FilesOpenFileSystemResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "FilesProxyImpl($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,
+          kFiles_openFileSystem_name,
+          -1,
+          bindings.MessageHeader.kMessageExpectsResponse);
+    }
+}
+
+
+class FilesProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  Files ptr;
+  final String name = FilesName;
+
+  FilesProxy(FilesProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _FilesProxyCalls(proxyImpl);
+
+  FilesProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new FilesProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _FilesProxyCalls(impl);
+  }
+
+  FilesProxy.fromHandle(core.MojoHandle handle) :
+      impl = new FilesProxyImpl.fromHandle(handle) {
+    ptr = new _FilesProxyCalls(impl);
+  }
+
+  FilesProxy.unbound() :
+      impl = new FilesProxyImpl.unbound() {
+    ptr = new _FilesProxyCalls(impl);
+  }
+
+  factory FilesProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    FilesProxy p = new FilesProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static FilesProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For FilesProxy"));
+    return new FilesProxy.fromEndpoint(endpoint);
+  }
+
+  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)";
+  }
+}
+
+
+class FilesStub extends bindings.Stub {
+  Files _impl = null;
+
+  FilesStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  FilesStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  FilesStub.unbound() : super.unbound();
+
+  static FilesStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For FilesStub"));
+    return new FilesStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = FilesName;
+
+
+  FilesOpenFileSystemResponseParams _FilesOpenFileSystemResponseParamsFactory(types_mojom.Error error) {
+    var result = new FilesOpenFileSystemResponseParams();
+    result.error = error;
+    return result;
+  }
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      case kFiles_openFileSystem_name:
+        var params = FilesOpenFileSystemParams.deserialize(
+            message.payload);
+        var response = _impl.openFileSystem(params.fileSystem,params.directory,_FilesOpenFileSystemResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kFiles_openFileSystem_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kFiles_openFileSystem_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  Files get impl => _impl;
+  set impl(Files d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "FilesStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/files/ioctl.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/files/ioctl.mojom.dart
new file mode 100644
index 0000000..b8fc83c
--- /dev/null
+++ b/mojo/dart/packages/mojo_services/lib/mojo/files/ioctl.mojom.dart
@@ -0,0 +1,15 @@
+// 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.
+
+library ioctl_mojom;
+
+import 'dart:async';
+
+import 'package:mojo/bindings.dart' as bindings;
+import 'package:mojo/core.dart' as core;
+const kIoctlInvalid = 0;
+const kIoctlTerminal = 1;
+
+
+
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/files/ioctl_terminal.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/files/ioctl_terminal.mojom.dart
new file mode 100644
index 0000000..7622770
--- /dev/null
+++ b/mojo/dart/packages/mojo_services/lib/mojo/files/ioctl_terminal.mojom.dart
@@ -0,0 +1,108 @@
+// 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.
+
+library ioctl_terminal_mojom;
+
+import 'dart:async';
+
+import 'package:mojo/bindings.dart' as bindings;
+import 'package:mojo/core.dart' as core;
+const kIoctlTerminalInvalid = 0;
+const kIoctlTerminalGetSettings = 1;
+const kIoctlTerminalSetSettings = 2;
+const kIoctlTerminalGetWindowSize = 3;
+const kIoctlTerminalSetWindowSize = 4;
+const kIoctlTerminalTermiosBaseFieldCount = 6;
+const kIoctlTerminalTermiosIFlagIndex = 0;
+const kIoctlTerminalTermiosOFlagIndex = 1;
+const kIoctlTerminalTermiosCFlagIndex = 2;
+const kIoctlTerminalTermiosLFlagIndex = 3;
+const kIoctlTerminalTermiosISpeedIndex = 4;
+const kIoctlTerminalTermiosOSpeedIndex = 5;
+const kIoctlTerminalTermiosCtrlCharCount = 17;
+const kIoctlTerminalTermiosCtrlCharVINTRIndex = 17;
+const kIoctlTerminalTermiosCtrlCharVQUITIndex = 18;
+const kIoctlTerminalTermiosCtrlCharVERASEIndex = 19;
+const kIoctlTerminalTermiosCtrlCharVKILLIndex = 20;
+const kIoctlTerminalTermiosCtrlCharVEOFIndex = 21;
+const kIoctlTerminalTermiosCtrlCharVTIMEIndex = 22;
+const kIoctlTerminalTermiosCtrlCharVMINIndex = 23;
+const kIoctlTerminalTermiosCtrlCharVSWTCIndex = 24;
+const kIoctlTerminalTermiosCtrlCharVSTARTIndex = 25;
+const kIoctlTerminalTermiosCtrlCharVSTOPIndex = 26;
+const kIoctlTerminalTermiosCtrlCharVSUSPIndex = 27;
+const kIoctlTerminalTermiosCtrlCharVEOLIndex = 28;
+const kIoctlTerminalTermiosCtrlCharVREPRINTIndex = 29;
+const kIoctlTerminalTermiosCtrlCharVDISCARDIndex = 30;
+const kIoctlTerminalTermiosCtrlCharVWERASEIndex = 31;
+const kIoctlTerminalTermiosCtrlCharVLNEXTIndex = 32;
+const kIoctlTerminalTermiosCtrlCharVEOL2Index = 33;
+const kIoctlTerminalTermiosIFlagIGNBRK = 0x0001;
+const kIoctlTerminalTermiosIFlagBRKINT = 0x0002;
+const kIoctlTerminalTermiosIFlagIGNPAR = 0x0004;
+const kIoctlTerminalTermiosIFlagPARMRK = 0x0008;
+const kIoctlTerminalTermiosIFlagINPCK = 0x0010;
+const kIoctlTerminalTermiosIFlagISTRIP = 0x0020;
+const kIoctlTerminalTermiosIFlagINLCR = 0x0040;
+const kIoctlTerminalTermiosIFlagIGNCR = 0x0080;
+const kIoctlTerminalTermiosIFlagICRNL = 0x0100;
+const kIoctlTerminalTermiosIFlagIUCLC = 0x0200;
+const kIoctlTerminalTermiosIFlagIXON = 0x0400;
+const kIoctlTerminalTermiosIFlagIXANY = 0x0800;
+const kIoctlTerminalTermiosIFlagIXOFF = 0x1000;
+const kIoctlTerminalTermiosIFlagIMAXBEL = 0x2000;
+const kIoctlTerminalTermiosIFlagIUTF8 = 0x4000;
+const kIoctlTerminalTermiosOFlagOPOST = 0x0001;
+const kIoctlTerminalTermiosOFlagOLCUC = 0x0002;
+const kIoctlTerminalTermiosOFlagONLCR = 0x0004;
+const kIoctlTerminalTermiosOFlagOCRNL = 0x0008;
+const kIoctlTerminalTermiosOFlagONOCR = 0x0010;
+const kIoctlTerminalTermiosOFlagONLRET = 0x0020;
+const kIoctlTerminalTermiosOFlagOFILL = 0x0040;
+const kIoctlTerminalTermiosOFlagOFDEL = 0x0080;
+const kIoctlTerminalTermiosOFlagNLDLY = 0x0100;
+const kIoctlTerminalTermiosOFlagNL0 = 0x0000;
+const kIoctlTerminalTermiosOFlagNL1 = 0x0100;
+const kIoctlTerminalTermiosOFlagCRDLY = 0x0600;
+const kIoctlTerminalTermiosOFlagCR0 = 0x0000;
+const kIoctlTerminalTermiosOFlagCR1 = 0x0200;
+const kIoctlTerminalTermiosOFlagCR2 = 0x0400;
+const kIoctlTerminalTermiosOFlagCR3 = 0x0600;
+const kIoctlTerminalTermiosOFlagTABDLY = 0x1800;
+const kIoctlTerminalTermiosOFlagTAB0 = 0x0000;
+const kIoctlTerminalTermiosOFlagTAB1 = 0x0800;
+const kIoctlTerminalTermiosOFlagTAB2 = 0x1000;
+const kIoctlTerminalTermiosOFlagTAB3 = 0x1800;
+const kIoctlTerminalTermiosOFlagBSDLY = 0x2000;
+const kIoctlTerminalTermiosOFlagBS0 = 0x0000;
+const kIoctlTerminalTermiosOFlagBS1 = 0x2000;
+const kIoctlTerminalTermiosOFlagVTDLY = 0x4000;
+const kIoctlTerminalTermiosOFlagVT0 = 0x0000;
+const kIoctlTerminalTermiosOFlagVT1 = 0x4000;
+const kIoctlTerminalTermiosOFlagFFDLY = 0x8000;
+const kIoctlTerminalTermiosOFlagFF0 = 0x0000;
+const kIoctlTerminalTermiosOFlagFF1 = 0x8000;
+const kIoctlTerminalTermiosCFlagCSIZE = 0x0003;
+const kIoctlTerminalTermiosCFlagCS5 = 0x0000;
+const kIoctlTerminalTermiosCFlagCS6 = 0x0001;
+const kIoctlTerminalTermiosCFlagCS7 = 0x0002;
+const kIoctlTerminalTermiosCFlagCS8 = 0x0003;
+const kIoctlTerminalTermiosCFlagCSTOPB = 0x0004;
+const kIoctlTerminalTermiosCFlagCREAD = 0x0008;
+const kIoctlTerminalTermiosCFlagPARENB = 0x0010;
+const kIoctlTerminalTermiosCFlagPARODD = 0x0020;
+const kIoctlTerminalTermiosCFlagHUPCL = 0x0040;
+const kIoctlTerminalTermiosCFlagCLOCAL = 0x0080;
+const kIoctlTerminalTermiosLFlagISIG = 0x0001;
+const kIoctlTerminalTermiosLFlagICANON = 0x0002;
+const kIoctlTerminalTermiosLFlagXCASE = 0x0004;
+const kIoctlTerminalTermiosLFlagECHO = 0x0008;
+const kIoctlTerminalTermiosLFlagECHOE = 0x0010;
+const kIoctlTerminalTermiosLFlagECHOK = 0x0020;
+const kIoctlTerminalTermiosLFlagECHONL = 0x0040;
+const kIoctlTerminalTermiosLFlagNOFLSH = 0x0080;
+const kIoctlTerminalTermiosLFlagTOSTOP = 0x0100;
+
+
+
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/files/types.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/files/types.mojom.dart
new file mode 100644
index 0000000..f66d54f
--- /dev/null
+++ b/mojo/dart/packages/mojo_services/lib/mojo/files/types.mojom.dart
@@ -0,0 +1,565 @@
+// 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.
+
+library types_mojom;
+
+import 'dart:async';
+
+import 'package:mojo/bindings.dart' as bindings;
+import 'package:mojo/core.dart' as core;
+const kOpenFlagRead = 0x1;
+const kOpenFlagWrite = 0x2;
+const kOpenFlagCreate = 0x4;
+const kOpenFlagExclusive = 0x8;
+const kOpenFlagAppend = 0x10;
+const kOpenFlagTruncate = 0x20;
+const kDeleteFlagFileOnly = 0x1;
+const kDeleteFlagDirectoryOnly = 0x2;
+const kDeleteFlagRecursive = 0x4;
+class Error extends bindings.MojoEnum {
+  static const OK = const Error._(0);
+  static const UNKNOWN = const Error._(1);
+  static const INVALID_ARGUMENT = const Error._(2);
+  static const PERMISSION_DENIED = const Error._(3);
+  static const OUT_OF_RANGE = const Error._(4);
+  static const UNIMPLEMENTED = const Error._(5);
+  static const CLOSED = const Error._(6);
+  static const UNAVAILABLE = const Error._(7);
+  static const INTERNAL = const Error._(8);
+
+  const Error._(int v) : super(v);
+
+  static const Map<String, Error> valuesMap = const {
+    "OK": OK,
+    "UNKNOWN": UNKNOWN,
+    "INVALID_ARGUMENT": INVALID_ARGUMENT,
+    "PERMISSION_DENIED": PERMISSION_DENIED,
+    "OUT_OF_RANGE": OUT_OF_RANGE,
+    "UNIMPLEMENTED": UNIMPLEMENTED,
+    "CLOSED": CLOSED,
+    "UNAVAILABLE": UNAVAILABLE,
+    "INTERNAL": INTERNAL,
+  };
+  static const List<Error> values = const [
+    OK,
+    UNKNOWN,
+    INVALID_ARGUMENT,
+    PERMISSION_DENIED,
+    OUT_OF_RANGE,
+    UNIMPLEMENTED,
+    CLOSED,
+    UNAVAILABLE,
+    INTERNAL,
+  ];
+
+  static Error valueOf(String name) => valuesMap[name];
+
+  factory Error(int v) {
+    switch (v) {
+      case 0:
+        return OK;
+      case 1:
+        return UNKNOWN;
+      case 2:
+        return INVALID_ARGUMENT;
+      case 3:
+        return PERMISSION_DENIED;
+      case 4:
+        return OUT_OF_RANGE;
+      case 5:
+        return UNIMPLEMENTED;
+      case 6:
+        return CLOSED;
+      case 7:
+        return UNAVAILABLE;
+      case 8:
+        return INTERNAL;
+      default:
+        return null;
+    }
+  }
+
+  static Error decode(bindings.Decoder decoder0, int offset) {
+    int v = decoder0.decodeUint32(offset);
+    Error result = new Error(v);
+    if (result == null) {
+      throw new bindings.MojoCodecError(
+          'Bad value $v for enum Error.');
+    }
+    return result;
+  }
+
+  String toString() {
+    switch(this) {
+      case OK:
+        return 'Error.OK';
+      case UNKNOWN:
+        return 'Error.UNKNOWN';
+      case INVALID_ARGUMENT:
+        return 'Error.INVALID_ARGUMENT';
+      case PERMISSION_DENIED:
+        return 'Error.PERMISSION_DENIED';
+      case OUT_OF_RANGE:
+        return 'Error.OUT_OF_RANGE';
+      case UNIMPLEMENTED:
+        return 'Error.UNIMPLEMENTED';
+      case CLOSED:
+        return 'Error.CLOSED';
+      case UNAVAILABLE:
+        return 'Error.UNAVAILABLE';
+      case INTERNAL:
+        return 'Error.INTERNAL';
+    }
+  }
+
+  int toJson() => value;
+}
+class Whence extends bindings.MojoEnum {
+  static const FROM_CURRENT = const Whence._(0);
+  static const FROM_START = const Whence._(1);
+  static const FROM_END = const Whence._(2);
+
+  const Whence._(int v) : super(v);
+
+  static const Map<String, Whence> valuesMap = const {
+    "FROM_CURRENT": FROM_CURRENT,
+    "FROM_START": FROM_START,
+    "FROM_END": FROM_END,
+  };
+  static const List<Whence> values = const [
+    FROM_CURRENT,
+    FROM_START,
+    FROM_END,
+  ];
+
+  static Whence valueOf(String name) => valuesMap[name];
+
+  factory Whence(int v) {
+    switch (v) {
+      case 0:
+        return FROM_CURRENT;
+      case 1:
+        return FROM_START;
+      case 2:
+        return FROM_END;
+      default:
+        return null;
+    }
+  }
+
+  static Whence decode(bindings.Decoder decoder0, int offset) {
+    int v = decoder0.decodeUint32(offset);
+    Whence result = new Whence(v);
+    if (result == null) {
+      throw new bindings.MojoCodecError(
+          'Bad value $v for enum Whence.');
+    }
+    return result;
+  }
+
+  String toString() {
+    switch(this) {
+      case FROM_CURRENT:
+        return 'Whence.FROM_CURRENT';
+      case FROM_START:
+        return 'Whence.FROM_START';
+      case FROM_END:
+        return 'Whence.FROM_END';
+    }
+  }
+
+  int toJson() => value;
+}
+class FileType extends bindings.MojoEnum {
+  static const UNKNOWN = const FileType._(0);
+  static const REGULAR_FILE = const FileType._(1);
+  static const DIRECTORY = const FileType._(2);
+
+  const FileType._(int v) : super(v);
+
+  static const Map<String, FileType> valuesMap = const {
+    "UNKNOWN": UNKNOWN,
+    "REGULAR_FILE": REGULAR_FILE,
+    "DIRECTORY": DIRECTORY,
+  };
+  static const List<FileType> values = const [
+    UNKNOWN,
+    REGULAR_FILE,
+    DIRECTORY,
+  ];
+
+  static FileType valueOf(String name) => valuesMap[name];
+
+  factory FileType(int v) {
+    switch (v) {
+      case 0:
+        return UNKNOWN;
+      case 1:
+        return REGULAR_FILE;
+      case 2:
+        return DIRECTORY;
+      default:
+        return null;
+    }
+  }
+
+  static FileType decode(bindings.Decoder decoder0, int offset) {
+    int v = decoder0.decodeUint32(offset);
+    FileType result = new FileType(v);
+    if (result == null) {
+      throw new bindings.MojoCodecError(
+          'Bad value $v for enum FileType.');
+    }
+    return result;
+  }
+
+  String toString() {
+    switch(this) {
+      case UNKNOWN:
+        return 'FileType.UNKNOWN';
+      case REGULAR_FILE:
+        return 'FileType.REGULAR_FILE';
+      case DIRECTORY:
+        return 'FileType.DIRECTORY';
+    }
+  }
+
+  int toJson() => value;
+}
+
+
+
+class Timespec extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  int seconds = 0;
+  int nanoseconds = 0;
+
+  Timespec() : super(kVersions.last.size);
+
+  static Timespec deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static Timespec decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    Timespec result = new Timespec();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.seconds = decoder0.decodeInt64(8);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.nanoseconds = decoder0.decodeInt32(16);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeInt64(seconds, 8);
+    
+    encoder0.encodeInt32(nanoseconds, 16);
+  }
+
+  String toString() {
+    return "Timespec("
+           "seconds: $seconds" ", "
+           "nanoseconds: $nanoseconds" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["seconds"] = seconds;
+    map["nanoseconds"] = nanoseconds;
+    return map;
+  }
+}
+
+
+class TimespecOrNow extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  bool now = false;
+  Timespec timespec = null;
+
+  TimespecOrNow() : super(kVersions.last.size);
+
+  static TimespecOrNow deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static TimespecOrNow decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    TimespecOrNow result = new TimespecOrNow();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.now = decoder0.decodeBool(8, 0);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(16, true);
+      result.timespec = Timespec.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeBool(now, 8, 0);
+    
+    encoder0.encodeStruct(timespec, 16, true);
+  }
+
+  String toString() {
+    return "TimespecOrNow("
+           "now: $now" ", "
+           "timespec: $timespec" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["now"] = now;
+    map["timespec"] = timespec;
+    return map;
+  }
+}
+
+
+class FileInformation extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(40, 0)
+  ];
+  FileType type = null;
+  int size = 0;
+  Timespec atime = null;
+  Timespec mtime = null;
+
+  FileInformation() : super(kVersions.last.size);
+
+  static FileInformation deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static FileInformation decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    FileInformation result = new FileInformation();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+        result.type = FileType.decode(decoder0, 8);
+        if (result.type == null) {
+          throw new bindings.MojoCodecError(
+            'Trying to decode null union for non-nullable FileType.');
+        }
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.size = decoder0.decodeInt64(16);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(24, true);
+      result.atime = Timespec.decode(decoder1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(32, true);
+      result.mtime = Timespec.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeEnum(type, 8);
+    
+    encoder0.encodeInt64(size, 16);
+    
+    encoder0.encodeStruct(atime, 24, true);
+    
+    encoder0.encodeStruct(mtime, 32, true);
+  }
+
+  String toString() {
+    return "FileInformation("
+           "type: $type" ", "
+           "size: $size" ", "
+           "atime: $atime" ", "
+           "mtime: $mtime" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["type"] = type;
+    map["size"] = size;
+    map["atime"] = atime;
+    map["mtime"] = mtime;
+    return map;
+  }
+}
+
+
+class DirectoryEntry extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  FileType type = null;
+  String name = null;
+
+  DirectoryEntry() : super(kVersions.last.size);
+
+  static DirectoryEntry deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static DirectoryEntry decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    DirectoryEntry result = new DirectoryEntry();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+        result.type = FileType.decode(decoder0, 8);
+        if (result.type == null) {
+          throw new bindings.MojoCodecError(
+            'Trying to decode null union for non-nullable FileType.');
+        }
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.name = decoder0.decodeString(16, false);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeEnum(type, 8);
+    
+    encoder0.encodeString(name, 16, false);
+  }
+
+  String toString() {
+    return "DirectoryEntry("
+           "type: $type" ", "
+           "name: $name" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["type"] = type;
+    map["name"] = name;
+    return map;
+  }
+}
+
+
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/geocoder.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/geocoder.mojom.dart
new file mode 100644
index 0000000..2cc532b
--- /dev/null
+++ b/mojo/dart/packages/mojo_services/lib/mojo/geocoder.mojom.dart
@@ -0,0 +1,1239 @@
+// 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.
+
+library geocoder_mojom;
+
+import 'dart:async';
+
+import 'package:mojo/bindings.dart' as bindings;
+import 'package:mojo/core.dart' as core;
+import 'package:mojo_services/mojo/location.mojom.dart' as location_mojom;
+
+
+
+class LocationType extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(8, 0)
+  ];
+  static const ROOFTOP = "ROOFTOP";
+  static const RANGE_INTERPOLATED = "RANGE_INTERPOLATED";
+  static const GEOMETRIC_CENTER = "GEOMETRIC_CENTER";
+  static const APPROXIMATE = "APPROXIMATE";
+
+  LocationType() : super(kVersions.last.size);
+
+  static LocationType deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static LocationType decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    LocationType result = new LocationType();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    encoder.getStructEncoderAtOffset(kVersions.last);
+  }
+
+  String toString() {
+    return "LocationType("")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    return map;
+  }
+}
+
+
+class Bounds extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  location_mojom.Location northeast = null;
+  location_mojom.Location southwest = null;
+
+  Bounds() : super(kVersions.last.size);
+
+  static Bounds deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static Bounds decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    Bounds result = new Bounds();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, false);
+      result.northeast = location_mojom.Location.decode(decoder1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(16, false);
+      result.southwest = location_mojom.Location.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(northeast, 8, false);
+    
+    encoder0.encodeStruct(southwest, 16, false);
+  }
+
+  String toString() {
+    return "Bounds("
+           "northeast: $northeast" ", "
+           "southwest: $southwest" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["northeast"] = northeast;
+    map["southwest"] = southwest;
+    return map;
+  }
+}
+
+
+class ComponentRestrictions extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(48, 0)
+  ];
+  String administrativeArea = null;
+  String country = null;
+  String locality = null;
+  String postalCode = null;
+  String route = null;
+
+  ComponentRestrictions() : super(kVersions.last.size);
+
+  static ComponentRestrictions deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ComponentRestrictions decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ComponentRestrictions result = new ComponentRestrictions();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.administrativeArea = decoder0.decodeString(8, true);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.country = decoder0.decodeString(16, true);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.locality = decoder0.decodeString(24, true);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.postalCode = decoder0.decodeString(32, true);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.route = decoder0.decodeString(40, true);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeString(administrativeArea, 8, true);
+    
+    encoder0.encodeString(country, 16, true);
+    
+    encoder0.encodeString(locality, 24, true);
+    
+    encoder0.encodeString(postalCode, 32, true);
+    
+    encoder0.encodeString(route, 40, true);
+  }
+
+  String toString() {
+    return "ComponentRestrictions("
+           "administrativeArea: $administrativeArea" ", "
+           "country: $country" ", "
+           "locality: $locality" ", "
+           "postalCode: $postalCode" ", "
+           "route: $route" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["administrativeArea"] = administrativeArea;
+    map["country"] = country;
+    map["locality"] = locality;
+    map["postalCode"] = postalCode;
+    map["route"] = route;
+    return map;
+  }
+}
+
+
+class Options extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(32, 0)
+  ];
+  ComponentRestrictions restrictions = null;
+  location_mojom.Location location = null;
+  String region = null;
+
+  Options() : super(kVersions.last.size);
+
+  static Options deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static Options decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    Options result = new Options();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, true);
+      result.restrictions = ComponentRestrictions.decode(decoder1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(16, true);
+      result.location = location_mojom.Location.decode(decoder1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.region = decoder0.decodeString(24, true);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(restrictions, 8, true);
+    
+    encoder0.encodeStruct(location, 16, true);
+    
+    encoder0.encodeString(region, 24, true);
+  }
+
+  String toString() {
+    return "Options("
+           "restrictions: $restrictions" ", "
+           "location: $location" ", "
+           "region: $region" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["restrictions"] = restrictions;
+    map["location"] = location;
+    map["region"] = region;
+    return map;
+  }
+}
+
+
+class Geometry extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(40, 0)
+  ];
+  location_mojom.Location location = null;
+  LocationType locationType = null;
+  Bounds viewport = null;
+  Bounds bounds = null;
+
+  Geometry() : super(kVersions.last.size);
+
+  static Geometry deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static Geometry decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    Geometry result = new Geometry();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, false);
+      result.location = location_mojom.Location.decode(decoder1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(16, false);
+      result.locationType = LocationType.decode(decoder1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(24, false);
+      result.viewport = Bounds.decode(decoder1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(32, true);
+      result.bounds = Bounds.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(location, 8, false);
+    
+    encoder0.encodeStruct(locationType, 16, false);
+    
+    encoder0.encodeStruct(viewport, 24, false);
+    
+    encoder0.encodeStruct(bounds, 32, true);
+  }
+
+  String toString() {
+    return "Geometry("
+           "location: $location" ", "
+           "locationType: $locationType" ", "
+           "viewport: $viewport" ", "
+           "bounds: $bounds" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["location"] = location;
+    map["locationType"] = locationType;
+    map["viewport"] = viewport;
+    map["bounds"] = bounds;
+    return map;
+  }
+}
+
+
+class Result extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(40, 0)
+  ];
+  bool partialMatch = false;
+  Geometry geometry = null;
+  String formattedAddress = null;
+  List<String> types = null;
+
+  Result() : super(kVersions.last.size);
+
+  static Result deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static Result decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    Result result = new Result();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.partialMatch = decoder0.decodeBool(8, 0);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(16, false);
+      result.geometry = Geometry.decode(decoder1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.formattedAddress = decoder0.decodeString(24, false);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(32, false);
+      {
+        var si1 = decoder1.decodeDataHeaderForPointerArray(bindings.kUnspecifiedArrayLength);
+        result.types = new List<String>(si1.numElements);
+        for (int i1 = 0; i1 < si1.numElements; ++i1) {
+          
+          result.types[i1] = decoder1.decodeString(bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i1, false);
+        }
+      }
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeBool(partialMatch, 8, 0);
+    
+    encoder0.encodeStruct(geometry, 16, false);
+    
+    encoder0.encodeString(formattedAddress, 24, false);
+    
+    if (types == null) {
+      encoder0.encodeNullPointer(32, false);
+    } else {
+      var encoder1 = encoder0.encodePointerArray(types.length, 32, bindings.kUnspecifiedArrayLength);
+      for (int i0 = 0; i0 < types.length; ++i0) {
+        
+        encoder1.encodeString(types[i0], bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i0, false);
+      }
+    }
+  }
+
+  String toString() {
+    return "Result("
+           "partialMatch: $partialMatch" ", "
+           "geometry: $geometry" ", "
+           "formattedAddress: $formattedAddress" ", "
+           "types: $types" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["partialMatch"] = partialMatch;
+    map["geometry"] = geometry;
+    map["formattedAddress"] = formattedAddress;
+    map["types"] = types;
+    return map;
+  }
+}
+
+
+class Status extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(8, 0)
+  ];
+  static const OK = "OK";
+  static const ZERO_RESULTS = "ZERO_RESULTS";
+  static const OVER_QUERY_LIMIT = "OVER_QUERY_LIMIT";
+  static const REQUEST_DENIED = "REQUEST_DENIED";
+  static const INVALID_REQUEST = "INVALID_REQUEST";
+
+  Status() : super(kVersions.last.size);
+
+  static Status deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static Status decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    Status result = new Status();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    encoder.getStructEncoderAtOffset(kVersions.last);
+  }
+
+  String toString() {
+    return "Status("")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    return map;
+  }
+}
+
+
+class GeocoderAddressToLocationParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  String address = null;
+  Options options = null;
+
+  GeocoderAddressToLocationParams() : super(kVersions.last.size);
+
+  static GeocoderAddressToLocationParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static GeocoderAddressToLocationParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    GeocoderAddressToLocationParams result = new GeocoderAddressToLocationParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.address = decoder0.decodeString(8, false);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(16, true);
+      result.options = Options.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeString(address, 8, false);
+    
+    encoder0.encodeStruct(options, 16, true);
+  }
+
+  String toString() {
+    return "GeocoderAddressToLocationParams("
+           "address: $address" ", "
+           "options: $options" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["address"] = address;
+    map["options"] = options;
+    return map;
+  }
+}
+
+
+class GeocoderAddressToLocationResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  String status = null;
+  List<Result> results = null;
+
+  GeocoderAddressToLocationResponseParams() : super(kVersions.last.size);
+
+  static GeocoderAddressToLocationResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static GeocoderAddressToLocationResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    GeocoderAddressToLocationResponseParams result = new GeocoderAddressToLocationResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.status = decoder0.decodeString(8, false);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(16, true);
+      if (decoder1 == null) {
+        result.results = null;
+      } else {
+        var si1 = decoder1.decodeDataHeaderForPointerArray(bindings.kUnspecifiedArrayLength);
+        result.results = new List<Result>(si1.numElements);
+        for (int i1 = 0; i1 < si1.numElements; ++i1) {
+          
+          var decoder2 = decoder1.decodePointer(bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i1, false);
+          result.results[i1] = Result.decode(decoder2);
+        }
+      }
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeString(status, 8, false);
+    
+    if (results == null) {
+      encoder0.encodeNullPointer(16, true);
+    } else {
+      var encoder1 = encoder0.encodePointerArray(results.length, 16, bindings.kUnspecifiedArrayLength);
+      for (int i0 = 0; i0 < results.length; ++i0) {
+        
+        encoder1.encodeStruct(results[i0], bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i0, false);
+      }
+    }
+  }
+
+  String toString() {
+    return "GeocoderAddressToLocationResponseParams("
+           "status: $status" ", "
+           "results: $results" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["status"] = status;
+    map["results"] = results;
+    return map;
+  }
+}
+
+
+class GeocoderLocationToAddressParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  location_mojom.Location location = null;
+  Options options = null;
+
+  GeocoderLocationToAddressParams() : super(kVersions.last.size);
+
+  static GeocoderLocationToAddressParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static GeocoderLocationToAddressParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    GeocoderLocationToAddressParams result = new GeocoderLocationToAddressParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, false);
+      result.location = location_mojom.Location.decode(decoder1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(16, true);
+      result.options = Options.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(location, 8, false);
+    
+    encoder0.encodeStruct(options, 16, true);
+  }
+
+  String toString() {
+    return "GeocoderLocationToAddressParams("
+           "location: $location" ", "
+           "options: $options" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["location"] = location;
+    map["options"] = options;
+    return map;
+  }
+}
+
+
+class GeocoderLocationToAddressResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  String status = null;
+  List<Result> results = null;
+
+  GeocoderLocationToAddressResponseParams() : super(kVersions.last.size);
+
+  static GeocoderLocationToAddressResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static GeocoderLocationToAddressResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    GeocoderLocationToAddressResponseParams result = new GeocoderLocationToAddressResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.status = decoder0.decodeString(8, false);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(16, true);
+      if (decoder1 == null) {
+        result.results = null;
+      } else {
+        var si1 = decoder1.decodeDataHeaderForPointerArray(bindings.kUnspecifiedArrayLength);
+        result.results = new List<Result>(si1.numElements);
+        for (int i1 = 0; i1 < si1.numElements; ++i1) {
+          
+          var decoder2 = decoder1.decodePointer(bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i1, false);
+          result.results[i1] = Result.decode(decoder2);
+        }
+      }
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeString(status, 8, false);
+    
+    if (results == null) {
+      encoder0.encodeNullPointer(16, true);
+    } else {
+      var encoder1 = encoder0.encodePointerArray(results.length, 16, bindings.kUnspecifiedArrayLength);
+      for (int i0 = 0; i0 < results.length; ++i0) {
+        
+        encoder1.encodeStruct(results[i0], bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i0, false);
+      }
+    }
+  }
+
+  String toString() {
+    return "GeocoderLocationToAddressResponseParams("
+           "status: $status" ", "
+           "results: $results" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["status"] = status;
+    map["results"] = results;
+    return map;
+  }
+}
+
+const int kGeocoder_addressToLocation_name = 0;
+const int kGeocoder_locationToAddress_name = 1;
+
+const String GeocoderName =
+      'mojo::Geocoder';
+
+abstract class Geocoder {
+  dynamic addressToLocation(String address,Options options,[Function responseFactory = null]);
+  dynamic locationToAddress(location_mojom.Location location,Options options,[Function responseFactory = null]);
+
+}
+
+
+class GeocoderProxyImpl extends bindings.Proxy {
+  GeocoderProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  GeocoderProxyImpl.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);
+  }
+
+  String get name => GeocoderName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      case kGeocoder_addressToLocation_name:
+        var r = GeocoderAddressToLocationResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      case kGeocoder_locationToAddress_name:
+        var r = GeocoderLocationToAddressResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "GeocoderProxyImpl($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,
+          kGeocoder_addressToLocation_name,
+          -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,
+          kGeocoder_locationToAddress_name,
+          -1,
+          bindings.MessageHeader.kMessageExpectsResponse);
+    }
+}
+
+
+class GeocoderProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  Geocoder ptr;
+  final String name = GeocoderName;
+
+  GeocoderProxy(GeocoderProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _GeocoderProxyCalls(proxyImpl);
+
+  GeocoderProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new GeocoderProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _GeocoderProxyCalls(impl);
+  }
+
+  GeocoderProxy.fromHandle(core.MojoHandle handle) :
+      impl = new GeocoderProxyImpl.fromHandle(handle) {
+    ptr = new _GeocoderProxyCalls(impl);
+  }
+
+  GeocoderProxy.unbound() :
+      impl = new GeocoderProxyImpl.unbound() {
+    ptr = new _GeocoderProxyCalls(impl);
+  }
+
+  factory GeocoderProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    GeocoderProxy p = new GeocoderProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static GeocoderProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For GeocoderProxy"));
+    return new GeocoderProxy.fromEndpoint(endpoint);
+  }
+
+  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)";
+  }
+}
+
+
+class GeocoderStub extends bindings.Stub {
+  Geocoder _impl = null;
+
+  GeocoderStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  GeocoderStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  GeocoderStub.unbound() : super.unbound();
+
+  static GeocoderStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For GeocoderStub"));
+    return new GeocoderStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = GeocoderName;
+
+
+  GeocoderAddressToLocationResponseParams _GeocoderAddressToLocationResponseParamsFactory(String status, List<Result> results) {
+    var result = new GeocoderAddressToLocationResponseParams();
+    result.status = status;
+    result.results = results;
+    return result;
+  }
+  GeocoderLocationToAddressResponseParams _GeocoderLocationToAddressResponseParamsFactory(String status, List<Result> results) {
+    var result = new GeocoderLocationToAddressResponseParams();
+    result.status = status;
+    result.results = results;
+    return result;
+  }
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      case kGeocoder_addressToLocation_name:
+        var params = GeocoderAddressToLocationParams.deserialize(
+            message.payload);
+        var response = _impl.addressToLocation(params.address,params.options,_GeocoderAddressToLocationResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kGeocoder_addressToLocation_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kGeocoder_addressToLocation_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      case kGeocoder_locationToAddress_name:
+        var params = GeocoderLocationToAddressParams.deserialize(
+            message.payload);
+        var response = _impl.locationToAddress(params.location,params.options,_GeocoderLocationToAddressResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kGeocoder_locationToAddress_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kGeocoder_locationToAddress_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  Geocoder get impl => _impl;
+  set impl(Geocoder d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "GeocoderStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/geometry.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/geometry.mojom.dart
new file mode 100644
index 0000000..90422dd
--- /dev/null
+++ b/mojo/dart/packages/mojo_services/lib/mojo/geometry.mojom.dart
@@ -0,0 +1,496 @@
+// 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.
+
+library geometry_mojom;
+
+import 'dart:async';
+
+import 'package:mojo/bindings.dart' as bindings;
+import 'package:mojo/core.dart' as core;
+
+
+
+class Point extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  int x = 0;
+  int y = 0;
+
+  Point() : super(kVersions.last.size);
+
+  static Point deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static Point decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    Point result = new Point();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.x = decoder0.decodeInt32(8);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.y = decoder0.decodeInt32(12);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeInt32(x, 8);
+    
+    encoder0.encodeInt32(y, 12);
+  }
+
+  String toString() {
+    return "Point("
+           "x: $x" ", "
+           "y: $y" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["x"] = x;
+    map["y"] = y;
+    return map;
+  }
+}
+
+
+class PointF extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  double x = 0.0;
+  double y = 0.0;
+
+  PointF() : super(kVersions.last.size);
+
+  static PointF deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static PointF decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    PointF result = new PointF();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.x = decoder0.decodeFloat(8);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.y = decoder0.decodeFloat(12);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeFloat(x, 8);
+    
+    encoder0.encodeFloat(y, 12);
+  }
+
+  String toString() {
+    return "PointF("
+           "x: $x" ", "
+           "y: $y" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["x"] = x;
+    map["y"] = y;
+    return map;
+  }
+}
+
+
+class Size extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  int width = 0;
+  int height = 0;
+
+  Size() : super(kVersions.last.size);
+
+  static Size deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static Size decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    Size result = new Size();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.width = decoder0.decodeInt32(8);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.height = decoder0.decodeInt32(12);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeInt32(width, 8);
+    
+    encoder0.encodeInt32(height, 12);
+  }
+
+  String toString() {
+    return "Size("
+           "width: $width" ", "
+           "height: $height" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["width"] = width;
+    map["height"] = height;
+    return map;
+  }
+}
+
+
+class Rect extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  int x = 0;
+  int y = 0;
+  int width = 0;
+  int height = 0;
+
+  Rect() : super(kVersions.last.size);
+
+  static Rect deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static Rect decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    Rect result = new Rect();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.x = decoder0.decodeInt32(8);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.y = decoder0.decodeInt32(12);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.width = decoder0.decodeInt32(16);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.height = decoder0.decodeInt32(20);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeInt32(x, 8);
+    
+    encoder0.encodeInt32(y, 12);
+    
+    encoder0.encodeInt32(width, 16);
+    
+    encoder0.encodeInt32(height, 20);
+  }
+
+  String toString() {
+    return "Rect("
+           "x: $x" ", "
+           "y: $y" ", "
+           "width: $width" ", "
+           "height: $height" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["x"] = x;
+    map["y"] = y;
+    map["width"] = width;
+    map["height"] = height;
+    return map;
+  }
+}
+
+
+class RectF extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  double x = 0.0;
+  double y = 0.0;
+  double width = 0.0;
+  double height = 0.0;
+
+  RectF() : super(kVersions.last.size);
+
+  static RectF deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static RectF decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    RectF result = new RectF();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.x = decoder0.decodeFloat(8);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.y = decoder0.decodeFloat(12);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.width = decoder0.decodeFloat(16);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.height = decoder0.decodeFloat(20);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeFloat(x, 8);
+    
+    encoder0.encodeFloat(y, 12);
+    
+    encoder0.encodeFloat(width, 16);
+    
+    encoder0.encodeFloat(height, 20);
+  }
+
+  String toString() {
+    return "RectF("
+           "x: $x" ", "
+           "y: $y" ", "
+           "width: $width" ", "
+           "height: $height" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["x"] = x;
+    map["y"] = y;
+    map["width"] = width;
+    map["height"] = height;
+    return map;
+  }
+}
+
+
+class Transform extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  List<double> matrix = null;
+
+  Transform() : super(kVersions.last.size);
+
+  static Transform deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static Transform decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    Transform result = new Transform();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.matrix = decoder0.decodeFloatArray(8, bindings.kNothingNullable, 16);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeFloatArray(matrix, 8, bindings.kNothingNullable, 16);
+  }
+
+  String toString() {
+    return "Transform("
+           "matrix: $matrix" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["matrix"] = matrix;
+    return map;
+  }
+}
+
+
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/gpu.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/gpu.mojom.dart
new file mode 100644
index 0000000..b817729
--- /dev/null
+++ b/mojo/dart/packages/mojo_services/lib/mojo/gpu.mojom.dart
@@ -0,0 +1,255 @@
+// 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.
+
+library gpu_mojom;
+
+import 'dart:async';
+
+import 'package:mojo/bindings.dart' as bindings;
+import 'package:mojo/core.dart' as core;
+import 'package:mojo_services/mojo/command_buffer.mojom.dart' as command_buffer_mojom;
+
+
+
+class GpuCreateOffscreenGleS2ContextParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  Object gles2Client = null;
+
+  GpuCreateOffscreenGleS2ContextParams() : super(kVersions.last.size);
+
+  static GpuCreateOffscreenGleS2ContextParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static GpuCreateOffscreenGleS2ContextParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    GpuCreateOffscreenGleS2ContextParams result = new GpuCreateOffscreenGleS2ContextParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.gles2Client = decoder0.decodeInterfaceRequest(8, false, command_buffer_mojom.CommandBufferStub.newFromEndpoint);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeInterfaceRequest(gles2Client, 8, false);
+  }
+
+  String toString() {
+    return "GpuCreateOffscreenGleS2ContextParams("
+           "gles2Client: $gles2Client" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+const int kGpu_createOffscreenGleS2Context_name = 0;
+
+const String GpuName =
+      'mojo::Gpu';
+
+abstract class Gpu {
+  void createOffscreenGleS2Context(Object gles2Client);
+
+}
+
+
+class GpuProxyImpl extends bindings.Proxy {
+  GpuProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  GpuProxyImpl.fromHandle(core.MojoHandle handle) :
+      super.fromHandle(handle);
+
+  GpuProxyImpl.unbound() : super.unbound();
+
+  static GpuProxyImpl newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For GpuProxyImpl"));
+    return new GpuProxyImpl.fromEndpoint(endpoint);
+  }
+
+  String get name => GpuName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "GpuProxyImpl($superString)";
+  }
+}
+
+
+class _GpuProxyCalls implements Gpu {
+  GpuProxyImpl _proxyImpl;
+
+  _GpuProxyCalls(this._proxyImpl);
+    void createOffscreenGleS2Context(Object gles2Client) {
+      if (!_proxyImpl.isBound) {
+        _proxyImpl.proxyError("The Proxy is closed.");
+        return;
+      }
+      var params = new GpuCreateOffscreenGleS2ContextParams();
+      params.gles2Client = gles2Client;
+      _proxyImpl.sendMessage(params, kGpu_createOffscreenGleS2Context_name);
+    }
+  
+}
+
+
+class GpuProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  Gpu ptr;
+  final String name = GpuName;
+
+  GpuProxy(GpuProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _GpuProxyCalls(proxyImpl);
+
+  GpuProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new GpuProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _GpuProxyCalls(impl);
+  }
+
+  GpuProxy.fromHandle(core.MojoHandle handle) :
+      impl = new GpuProxyImpl.fromHandle(handle) {
+    ptr = new _GpuProxyCalls(impl);
+  }
+
+  GpuProxy.unbound() :
+      impl = new GpuProxyImpl.unbound() {
+    ptr = new _GpuProxyCalls(impl);
+  }
+
+  factory GpuProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    GpuProxy p = new GpuProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static GpuProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For GpuProxy"));
+    return new GpuProxy.fromEndpoint(endpoint);
+  }
+
+  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 "GpuProxy($impl)";
+  }
+}
+
+
+class GpuStub extends bindings.Stub {
+  Gpu _impl = null;
+
+  GpuStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  GpuStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  GpuStub.unbound() : super.unbound();
+
+  static GpuStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For GpuStub"));
+    return new GpuStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = GpuName;
+
+
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      case kGpu_createOffscreenGleS2Context_name:
+        var params = GpuCreateOffscreenGleS2ContextParams.deserialize(
+            message.payload);
+        _impl.createOffscreenGleS2Context(params.gles2Client);
+        break;
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  Gpu get impl => _impl;
+  set impl(Gpu d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "GpuStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/gpu_capabilities.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/gpu_capabilities.mojom.dart
new file mode 100644
index 0000000..c9c57fc
--- /dev/null
+++ b/mojo/dart/packages/mojo_services/lib/mojo/gpu_capabilities.mojom.dart
@@ -0,0 +1,546 @@
+// 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.
+
+library gpu_capabilities_mojom;
+
+import 'dart:async';
+
+import 'package:mojo/bindings.dart' as bindings;
+import 'package:mojo/core.dart' as core;
+
+
+
+class GpuShaderPrecision extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  int minRange = 0;
+  int maxRange = 0;
+  int precision = 0;
+
+  GpuShaderPrecision() : super(kVersions.last.size);
+
+  static GpuShaderPrecision deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static GpuShaderPrecision decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    GpuShaderPrecision result = new GpuShaderPrecision();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.minRange = decoder0.decodeInt32(8);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.maxRange = decoder0.decodeInt32(12);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.precision = decoder0.decodeInt32(16);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeInt32(minRange, 8);
+    
+    encoder0.encodeInt32(maxRange, 12);
+    
+    encoder0.encodeInt32(precision, 16);
+  }
+
+  String toString() {
+    return "GpuShaderPrecision("
+           "minRange: $minRange" ", "
+           "maxRange: $maxRange" ", "
+           "precision: $precision" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["minRange"] = minRange;
+    map["maxRange"] = maxRange;
+    map["precision"] = precision;
+    return map;
+  }
+}
+
+
+class GpuPerStagePrecisions extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(56, 0)
+  ];
+  GpuShaderPrecision lowInt = null;
+  GpuShaderPrecision mediumInt = null;
+  GpuShaderPrecision highInt = null;
+  GpuShaderPrecision lowFloat = null;
+  GpuShaderPrecision mediumFloat = null;
+  GpuShaderPrecision highFloat = null;
+
+  GpuPerStagePrecisions() : super(kVersions.last.size);
+
+  static GpuPerStagePrecisions deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static GpuPerStagePrecisions decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    GpuPerStagePrecisions result = new GpuPerStagePrecisions();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, false);
+      result.lowInt = GpuShaderPrecision.decode(decoder1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(16, false);
+      result.mediumInt = GpuShaderPrecision.decode(decoder1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(24, false);
+      result.highInt = GpuShaderPrecision.decode(decoder1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(32, false);
+      result.lowFloat = GpuShaderPrecision.decode(decoder1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(40, false);
+      result.mediumFloat = GpuShaderPrecision.decode(decoder1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(48, false);
+      result.highFloat = GpuShaderPrecision.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(lowInt, 8, false);
+    
+    encoder0.encodeStruct(mediumInt, 16, false);
+    
+    encoder0.encodeStruct(highInt, 24, false);
+    
+    encoder0.encodeStruct(lowFloat, 32, false);
+    
+    encoder0.encodeStruct(mediumFloat, 40, false);
+    
+    encoder0.encodeStruct(highFloat, 48, false);
+  }
+
+  String toString() {
+    return "GpuPerStagePrecisions("
+           "lowInt: $lowInt" ", "
+           "mediumInt: $mediumInt" ", "
+           "highInt: $highInt" ", "
+           "lowFloat: $lowFloat" ", "
+           "mediumFloat: $mediumFloat" ", "
+           "highFloat: $highFloat" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["lowInt"] = lowInt;
+    map["mediumInt"] = mediumInt;
+    map["highInt"] = highInt;
+    map["lowFloat"] = lowFloat;
+    map["mediumFloat"] = mediumFloat;
+    map["highFloat"] = highFloat;
+    return map;
+  }
+}
+
+
+class GpuCapabilities extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(80, 0)
+  ];
+  GpuPerStagePrecisions vertexShaderPrecisions = null;
+  GpuPerStagePrecisions fragmentShaderPrecisions = null;
+  int maxCombinedTextureImageUnits = 0;
+  int maxCubeMapTextureSize = 0;
+  int maxFragmentUniformVectors = 0;
+  int maxRenderbufferSize = 0;
+  int maxTextureImageUnits = 0;
+  int maxTextureSize = 0;
+  int maxVaryingVectors = 0;
+  int maxVertexAttribs = 0;
+  int maxVertexTextureImageUnits = 0;
+  int maxVertexUniformVectors = 0;
+  int numCompressedTextureFormats = 0;
+  int numShaderBinaryFormats = 0;
+  int bindGeneratesResourceChromium = 0;
+  bool postSubBuffer = false;
+  bool eglImageExternal = false;
+  bool textureFormatBgra8888 = false;
+  bool textureFormatEtc1 = false;
+  bool textureFormatEtc1Npot = false;
+  bool textureRectangle = false;
+  bool iosurface = false;
+  bool textureUsage = false;
+  bool textureStorage = false;
+  bool discardFramebuffer = false;
+  bool syncQuery = false;
+  bool image = false;
+  bool futureSyncPoints = false;
+  bool blendEquationAdvanced = false;
+  bool blendEquationAdvancedCoherent = false;
+
+  GpuCapabilities() : super(kVersions.last.size);
+
+  static GpuCapabilities deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static GpuCapabilities decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    GpuCapabilities result = new GpuCapabilities();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, false);
+      result.vertexShaderPrecisions = GpuPerStagePrecisions.decode(decoder1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(16, false);
+      result.fragmentShaderPrecisions = GpuPerStagePrecisions.decode(decoder1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.maxCombinedTextureImageUnits = decoder0.decodeInt32(24);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.maxCubeMapTextureSize = decoder0.decodeInt32(28);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.maxFragmentUniformVectors = decoder0.decodeInt32(32);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.maxRenderbufferSize = decoder0.decodeInt32(36);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.maxTextureImageUnits = decoder0.decodeInt32(40);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.maxTextureSize = decoder0.decodeInt32(44);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.maxVaryingVectors = decoder0.decodeInt32(48);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.maxVertexAttribs = decoder0.decodeInt32(52);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.maxVertexTextureImageUnits = decoder0.decodeInt32(56);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.maxVertexUniformVectors = decoder0.decodeInt32(60);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.numCompressedTextureFormats = decoder0.decodeInt32(64);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.numShaderBinaryFormats = decoder0.decodeInt32(68);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.bindGeneratesResourceChromium = decoder0.decodeInt32(72);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.postSubBuffer = decoder0.decodeBool(76, 0);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.eglImageExternal = decoder0.decodeBool(76, 1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.textureFormatBgra8888 = decoder0.decodeBool(76, 2);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.textureFormatEtc1 = decoder0.decodeBool(76, 3);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.textureFormatEtc1Npot = decoder0.decodeBool(76, 4);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.textureRectangle = decoder0.decodeBool(76, 5);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.iosurface = decoder0.decodeBool(76, 6);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.textureUsage = decoder0.decodeBool(76, 7);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.textureStorage = decoder0.decodeBool(77, 0);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.discardFramebuffer = decoder0.decodeBool(77, 1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.syncQuery = decoder0.decodeBool(77, 2);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.image = decoder0.decodeBool(77, 3);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.futureSyncPoints = decoder0.decodeBool(77, 4);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.blendEquationAdvanced = decoder0.decodeBool(77, 5);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.blendEquationAdvancedCoherent = decoder0.decodeBool(77, 6);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(vertexShaderPrecisions, 8, false);
+    
+    encoder0.encodeStruct(fragmentShaderPrecisions, 16, false);
+    
+    encoder0.encodeInt32(maxCombinedTextureImageUnits, 24);
+    
+    encoder0.encodeInt32(maxCubeMapTextureSize, 28);
+    
+    encoder0.encodeInt32(maxFragmentUniformVectors, 32);
+    
+    encoder0.encodeInt32(maxRenderbufferSize, 36);
+    
+    encoder0.encodeInt32(maxTextureImageUnits, 40);
+    
+    encoder0.encodeInt32(maxTextureSize, 44);
+    
+    encoder0.encodeInt32(maxVaryingVectors, 48);
+    
+    encoder0.encodeInt32(maxVertexAttribs, 52);
+    
+    encoder0.encodeInt32(maxVertexTextureImageUnits, 56);
+    
+    encoder0.encodeInt32(maxVertexUniformVectors, 60);
+    
+    encoder0.encodeInt32(numCompressedTextureFormats, 64);
+    
+    encoder0.encodeInt32(numShaderBinaryFormats, 68);
+    
+    encoder0.encodeInt32(bindGeneratesResourceChromium, 72);
+    
+    encoder0.encodeBool(postSubBuffer, 76, 0);
+    
+    encoder0.encodeBool(eglImageExternal, 76, 1);
+    
+    encoder0.encodeBool(textureFormatBgra8888, 76, 2);
+    
+    encoder0.encodeBool(textureFormatEtc1, 76, 3);
+    
+    encoder0.encodeBool(textureFormatEtc1Npot, 76, 4);
+    
+    encoder0.encodeBool(textureRectangle, 76, 5);
+    
+    encoder0.encodeBool(iosurface, 76, 6);
+    
+    encoder0.encodeBool(textureUsage, 76, 7);
+    
+    encoder0.encodeBool(textureStorage, 77, 0);
+    
+    encoder0.encodeBool(discardFramebuffer, 77, 1);
+    
+    encoder0.encodeBool(syncQuery, 77, 2);
+    
+    encoder0.encodeBool(image, 77, 3);
+    
+    encoder0.encodeBool(futureSyncPoints, 77, 4);
+    
+    encoder0.encodeBool(blendEquationAdvanced, 77, 5);
+    
+    encoder0.encodeBool(blendEquationAdvancedCoherent, 77, 6);
+  }
+
+  String toString() {
+    return "GpuCapabilities("
+           "vertexShaderPrecisions: $vertexShaderPrecisions" ", "
+           "fragmentShaderPrecisions: $fragmentShaderPrecisions" ", "
+           "maxCombinedTextureImageUnits: $maxCombinedTextureImageUnits" ", "
+           "maxCubeMapTextureSize: $maxCubeMapTextureSize" ", "
+           "maxFragmentUniformVectors: $maxFragmentUniformVectors" ", "
+           "maxRenderbufferSize: $maxRenderbufferSize" ", "
+           "maxTextureImageUnits: $maxTextureImageUnits" ", "
+           "maxTextureSize: $maxTextureSize" ", "
+           "maxVaryingVectors: $maxVaryingVectors" ", "
+           "maxVertexAttribs: $maxVertexAttribs" ", "
+           "maxVertexTextureImageUnits: $maxVertexTextureImageUnits" ", "
+           "maxVertexUniformVectors: $maxVertexUniformVectors" ", "
+           "numCompressedTextureFormats: $numCompressedTextureFormats" ", "
+           "numShaderBinaryFormats: $numShaderBinaryFormats" ", "
+           "bindGeneratesResourceChromium: $bindGeneratesResourceChromium" ", "
+           "postSubBuffer: $postSubBuffer" ", "
+           "eglImageExternal: $eglImageExternal" ", "
+           "textureFormatBgra8888: $textureFormatBgra8888" ", "
+           "textureFormatEtc1: $textureFormatEtc1" ", "
+           "textureFormatEtc1Npot: $textureFormatEtc1Npot" ", "
+           "textureRectangle: $textureRectangle" ", "
+           "iosurface: $iosurface" ", "
+           "textureUsage: $textureUsage" ", "
+           "textureStorage: $textureStorage" ", "
+           "discardFramebuffer: $discardFramebuffer" ", "
+           "syncQuery: $syncQuery" ", "
+           "image: $image" ", "
+           "futureSyncPoints: $futureSyncPoints" ", "
+           "blendEquationAdvanced: $blendEquationAdvanced" ", "
+           "blendEquationAdvancedCoherent: $blendEquationAdvancedCoherent" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["vertexShaderPrecisions"] = vertexShaderPrecisions;
+    map["fragmentShaderPrecisions"] = fragmentShaderPrecisions;
+    map["maxCombinedTextureImageUnits"] = maxCombinedTextureImageUnits;
+    map["maxCubeMapTextureSize"] = maxCubeMapTextureSize;
+    map["maxFragmentUniformVectors"] = maxFragmentUniformVectors;
+    map["maxRenderbufferSize"] = maxRenderbufferSize;
+    map["maxTextureImageUnits"] = maxTextureImageUnits;
+    map["maxTextureSize"] = maxTextureSize;
+    map["maxVaryingVectors"] = maxVaryingVectors;
+    map["maxVertexAttribs"] = maxVertexAttribs;
+    map["maxVertexTextureImageUnits"] = maxVertexTextureImageUnits;
+    map["maxVertexUniformVectors"] = maxVertexUniformVectors;
+    map["numCompressedTextureFormats"] = numCompressedTextureFormats;
+    map["numShaderBinaryFormats"] = numShaderBinaryFormats;
+    map["bindGeneratesResourceChromium"] = bindGeneratesResourceChromium;
+    map["postSubBuffer"] = postSubBuffer;
+    map["eglImageExternal"] = eglImageExternal;
+    map["textureFormatBgra8888"] = textureFormatBgra8888;
+    map["textureFormatEtc1"] = textureFormatEtc1;
+    map["textureFormatEtc1Npot"] = textureFormatEtc1Npot;
+    map["textureRectangle"] = textureRectangle;
+    map["iosurface"] = iosurface;
+    map["textureUsage"] = textureUsage;
+    map["textureStorage"] = textureStorage;
+    map["discardFramebuffer"] = discardFramebuffer;
+    map["syncQuery"] = syncQuery;
+    map["image"] = image;
+    map["futureSyncPoints"] = futureSyncPoints;
+    map["blendEquationAdvanced"] = blendEquationAdvanced;
+    map["blendEquationAdvancedCoherent"] = blendEquationAdvancedCoherent;
+    return map;
+  }
+}
+
+
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
new file mode 100644
index 0000000..47b703d
--- /dev/null
+++ b/mojo/dart/packages/mojo_services/lib/mojo/host_resolver.mojom.dart
@@ -0,0 +1,409 @@
+// 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.
+
+library host_resolver_mojom;
+
+import 'dart:async';
+
+import 'package:mojo/bindings.dart' as bindings;
+import 'package:mojo/core.dart' as core;
+import 'package:mojo/mojo/network_error.mojom.dart' as network_error_mojom;
+import 'package:mojo_services/mojo/net_address.mojom.dart' as net_address_mojom;
+
+
+
+class HostResolverGetHostAddressesParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  String host = null;
+  net_address_mojom.NetAddressFamily family = null;
+
+  HostResolverGetHostAddressesParams() : super(kVersions.last.size);
+
+  static HostResolverGetHostAddressesParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static HostResolverGetHostAddressesParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    HostResolverGetHostAddressesParams result = new HostResolverGetHostAddressesParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.host = decoder0.decodeString(8, false);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+        result.family = net_address_mojom.NetAddressFamily.decode(decoder0, 16);
+        if (result.family == null) {
+          throw new bindings.MojoCodecError(
+            'Trying to decode null union for non-nullable net_address_mojom.NetAddressFamily.');
+        }
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeString(host, 8, false);
+    
+    encoder0.encodeEnum(family, 16);
+  }
+
+  String toString() {
+    return "HostResolverGetHostAddressesParams("
+           "host: $host" ", "
+           "family: $family" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["host"] = host;
+    map["family"] = family;
+    return map;
+  }
+}
+
+
+class HostResolverGetHostAddressesResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  network_error_mojom.NetworkError result = null;
+  List<net_address_mojom.NetAddress> addresses = null;
+
+  HostResolverGetHostAddressesResponseParams() : super(kVersions.last.size);
+
+  static HostResolverGetHostAddressesResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static HostResolverGetHostAddressesResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    HostResolverGetHostAddressesResponseParams result = new HostResolverGetHostAddressesResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, false);
+      result.result = network_error_mojom.NetworkError.decode(decoder1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(16, true);
+      if (decoder1 == null) {
+        result.addresses = null;
+      } else {
+        var si1 = decoder1.decodeDataHeaderForPointerArray(bindings.kUnspecifiedArrayLength);
+        result.addresses = new List<net_address_mojom.NetAddress>(si1.numElements);
+        for (int i1 = 0; i1 < si1.numElements; ++i1) {
+          
+          var decoder2 = decoder1.decodePointer(bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i1, false);
+          result.addresses[i1] = net_address_mojom.NetAddress.decode(decoder2);
+        }
+      }
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(result, 8, false);
+    
+    if (addresses == null) {
+      encoder0.encodeNullPointer(16, true);
+    } else {
+      var encoder1 = encoder0.encodePointerArray(addresses.length, 16, bindings.kUnspecifiedArrayLength);
+      for (int i0 = 0; i0 < addresses.length; ++i0) {
+        
+        encoder1.encodeStruct(addresses[i0], bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i0, false);
+      }
+    }
+  }
+
+  String toString() {
+    return "HostResolverGetHostAddressesResponseParams("
+           "result: $result" ", "
+           "addresses: $addresses" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["result"] = result;
+    map["addresses"] = addresses;
+    return map;
+  }
+}
+
+const int kHostResolver_getHostAddresses_name = 0;
+
+const String HostResolverName =
+      'mojo::HostResolver';
+
+abstract class HostResolver {
+  dynamic getHostAddresses(String host,net_address_mojom.NetAddressFamily family,[Function responseFactory = null]);
+
+}
+
+
+class HostResolverProxyImpl extends bindings.Proxy {
+  HostResolverProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  HostResolverProxyImpl.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);
+  }
+
+  String get name => HostResolverName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      case kHostResolver_getHostAddresses_name:
+        var r = HostResolverGetHostAddressesResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "HostResolverProxyImpl($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,
+          kHostResolver_getHostAddresses_name,
+          -1,
+          bindings.MessageHeader.kMessageExpectsResponse);
+    }
+}
+
+
+class HostResolverProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  HostResolver ptr;
+  final String name = HostResolverName;
+
+  HostResolverProxy(HostResolverProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _HostResolverProxyCalls(proxyImpl);
+
+  HostResolverProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new HostResolverProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _HostResolverProxyCalls(impl);
+  }
+
+  HostResolverProxy.fromHandle(core.MojoHandle handle) :
+      impl = new HostResolverProxyImpl.fromHandle(handle) {
+    ptr = new _HostResolverProxyCalls(impl);
+  }
+
+  HostResolverProxy.unbound() :
+      impl = new HostResolverProxyImpl.unbound() {
+    ptr = new _HostResolverProxyCalls(impl);
+  }
+
+  factory HostResolverProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    HostResolverProxy p = new HostResolverProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static HostResolverProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For HostResolverProxy"));
+    return new HostResolverProxy.fromEndpoint(endpoint);
+  }
+
+  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)";
+  }
+}
+
+
+class HostResolverStub extends bindings.Stub {
+  HostResolver _impl = null;
+
+  HostResolverStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  HostResolverStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  HostResolverStub.unbound() : super.unbound();
+
+  static HostResolverStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For HostResolverStub"));
+    return new HostResolverStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = HostResolverName;
+
+
+  HostResolverGetHostAddressesResponseParams _HostResolverGetHostAddressesResponseParamsFactory(network_error_mojom.NetworkError result, List<net_address_mojom.NetAddress> addresses) {
+    var result = new HostResolverGetHostAddressesResponseParams();
+    result.result = result;
+    result.addresses = addresses;
+    return result;
+  }
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      case kHostResolver_getHostAddresses_name:
+        var params = HostResolverGetHostAddressesParams.deserialize(
+            message.payload);
+        var response = _impl.getHostAddresses(params.host,params.family,_HostResolverGetHostAddressesResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kHostResolver_getHostAddresses_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kHostResolver_getHostAddresses_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  HostResolver get impl => _impl;
+  set impl(HostResolver d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "HostResolverStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+
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
new file mode 100644
index 0000000..146dfeb
--- /dev/null
+++ b/mojo/dart/packages/mojo_services/lib/mojo/http_connection.mojom.dart
@@ -0,0 +1,1119 @@
+// 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.
+
+library http_connection_mojom;
+
+import 'dart:async';
+
+import 'package:mojo/bindings.dart' as bindings;
+import 'package:mojo/core.dart' as core;
+import 'package:mojo/mojo/network_error.mojom.dart' as network_error_mojom;
+import 'package:mojo_services/mojo/http_message.mojom.dart' as http_message_mojom;
+import 'package:mojo_services/mojo/web_socket.mojom.dart' as web_socket_mojom;
+
+
+
+class HttpConnectionSetSendBufferSizeParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  int size = 0;
+
+  HttpConnectionSetSendBufferSizeParams() : super(kVersions.last.size);
+
+  static HttpConnectionSetSendBufferSizeParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static HttpConnectionSetSendBufferSizeParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    HttpConnectionSetSendBufferSizeParams result = new HttpConnectionSetSendBufferSizeParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.size = decoder0.decodeUint32(8);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeUint32(size, 8);
+  }
+
+  String toString() {
+    return "HttpConnectionSetSendBufferSizeParams("
+           "size: $size" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["size"] = size;
+    return map;
+  }
+}
+
+
+class HttpConnectionSetSendBufferSizeResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  network_error_mojom.NetworkError result = null;
+
+  HttpConnectionSetSendBufferSizeResponseParams() : super(kVersions.last.size);
+
+  static HttpConnectionSetSendBufferSizeResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static HttpConnectionSetSendBufferSizeResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    HttpConnectionSetSendBufferSizeResponseParams result = new HttpConnectionSetSendBufferSizeResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, false);
+      result.result = network_error_mojom.NetworkError.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(result, 8, false);
+  }
+
+  String toString() {
+    return "HttpConnectionSetSendBufferSizeResponseParams("
+           "result: $result" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["result"] = result;
+    return map;
+  }
+}
+
+
+class HttpConnectionSetReceiveBufferSizeParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  int size = 0;
+
+  HttpConnectionSetReceiveBufferSizeParams() : super(kVersions.last.size);
+
+  static HttpConnectionSetReceiveBufferSizeParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static HttpConnectionSetReceiveBufferSizeParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    HttpConnectionSetReceiveBufferSizeParams result = new HttpConnectionSetReceiveBufferSizeParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.size = decoder0.decodeUint32(8);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeUint32(size, 8);
+  }
+
+  String toString() {
+    return "HttpConnectionSetReceiveBufferSizeParams("
+           "size: $size" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["size"] = size;
+    return map;
+  }
+}
+
+
+class HttpConnectionSetReceiveBufferSizeResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  network_error_mojom.NetworkError result = null;
+
+  HttpConnectionSetReceiveBufferSizeResponseParams() : super(kVersions.last.size);
+
+  static HttpConnectionSetReceiveBufferSizeResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static HttpConnectionSetReceiveBufferSizeResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    HttpConnectionSetReceiveBufferSizeResponseParams result = new HttpConnectionSetReceiveBufferSizeResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, false);
+      result.result = network_error_mojom.NetworkError.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(result, 8, false);
+  }
+
+  String toString() {
+    return "HttpConnectionSetReceiveBufferSizeResponseParams("
+           "result: $result" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["result"] = result;
+    return map;
+  }
+}
+
+
+class HttpConnectionDelegateOnReceivedRequestParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  http_message_mojom.HttpRequest request = null;
+
+  HttpConnectionDelegateOnReceivedRequestParams() : super(kVersions.last.size);
+
+  static HttpConnectionDelegateOnReceivedRequestParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static HttpConnectionDelegateOnReceivedRequestParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    HttpConnectionDelegateOnReceivedRequestParams result = new HttpConnectionDelegateOnReceivedRequestParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, false);
+      result.request = http_message_mojom.HttpRequest.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(request, 8, false);
+  }
+
+  String toString() {
+    return "HttpConnectionDelegateOnReceivedRequestParams("
+           "request: $request" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+
+class HttpConnectionDelegateOnReceivedRequestResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  http_message_mojom.HttpResponse response = null;
+
+  HttpConnectionDelegateOnReceivedRequestResponseParams() : super(kVersions.last.size);
+
+  static HttpConnectionDelegateOnReceivedRequestResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static HttpConnectionDelegateOnReceivedRequestResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    HttpConnectionDelegateOnReceivedRequestResponseParams result = new HttpConnectionDelegateOnReceivedRequestResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, false);
+      result.response = http_message_mojom.HttpResponse.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(response, 8, false);
+  }
+
+  String toString() {
+    return "HttpConnectionDelegateOnReceivedRequestResponseParams("
+           "response: $response" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+
+class HttpConnectionDelegateOnReceivedWebSocketRequestParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  http_message_mojom.HttpRequest request = null;
+
+  HttpConnectionDelegateOnReceivedWebSocketRequestParams() : super(kVersions.last.size);
+
+  static HttpConnectionDelegateOnReceivedWebSocketRequestParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static HttpConnectionDelegateOnReceivedWebSocketRequestParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    HttpConnectionDelegateOnReceivedWebSocketRequestParams result = new HttpConnectionDelegateOnReceivedWebSocketRequestParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, false);
+      result.request = http_message_mojom.HttpRequest.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(request, 8, false);
+  }
+
+  String toString() {
+    return "HttpConnectionDelegateOnReceivedWebSocketRequestParams("
+           "request: $request" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+
+class HttpConnectionDelegateOnReceivedWebSocketRequestResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  Object webSocket = null;
+  core.MojoDataPipeConsumer sendStream = null;
+  Object client = null;
+
+  HttpConnectionDelegateOnReceivedWebSocketRequestResponseParams() : super(kVersions.last.size);
+
+  static HttpConnectionDelegateOnReceivedWebSocketRequestResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static HttpConnectionDelegateOnReceivedWebSocketRequestResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    HttpConnectionDelegateOnReceivedWebSocketRequestResponseParams result = new HttpConnectionDelegateOnReceivedWebSocketRequestResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.webSocket = decoder0.decodeInterfaceRequest(8, true, web_socket_mojom.WebSocketStub.newFromEndpoint);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.sendStream = decoder0.decodeConsumerHandle(12, true);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.client = decoder0.decodeServiceInterface(16, true, web_socket_mojom.WebSocketClientProxy.newFromEndpoint);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeInterfaceRequest(webSocket, 8, true);
+    
+    encoder0.encodeConsumerHandle(sendStream, 12, true);
+    
+    encoder0.encodeInterface(client, 16, true);
+  }
+
+  String toString() {
+    return "HttpConnectionDelegateOnReceivedWebSocketRequestResponseParams("
+           "webSocket: $webSocket" ", "
+           "sendStream: $sendStream" ", "
+           "client: $client" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+const int kHttpConnection_setSendBufferSize_name = 0;
+const int kHttpConnection_setReceiveBufferSize_name = 1;
+
+const String HttpConnectionName =
+      'mojo::HttpConnection';
+
+abstract class HttpConnection {
+  dynamic setSendBufferSize(int size,[Function responseFactory = null]);
+  dynamic setReceiveBufferSize(int size,[Function responseFactory = null]);
+
+}
+
+
+class HttpConnectionProxyImpl extends bindings.Proxy {
+  HttpConnectionProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  HttpConnectionProxyImpl.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);
+  }
+
+  String get name => HttpConnectionName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      case kHttpConnection_setSendBufferSize_name:
+        var r = HttpConnectionSetSendBufferSizeResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      case kHttpConnection_setReceiveBufferSize_name:
+        var r = HttpConnectionSetReceiveBufferSizeResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "HttpConnectionProxyImpl($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,
+          kHttpConnection_setSendBufferSize_name,
+          -1,
+          bindings.MessageHeader.kMessageExpectsResponse);
+    }
+    dynamic setReceiveBufferSize(int size,[Function responseFactory = null]) {
+      var params = new HttpConnectionSetReceiveBufferSizeParams();
+      params.size = size;
+      return _proxyImpl.sendMessageWithRequestId(
+          params,
+          kHttpConnection_setReceiveBufferSize_name,
+          -1,
+          bindings.MessageHeader.kMessageExpectsResponse);
+    }
+}
+
+
+class HttpConnectionProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  HttpConnection ptr;
+  final String name = HttpConnectionName;
+
+  HttpConnectionProxy(HttpConnectionProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _HttpConnectionProxyCalls(proxyImpl);
+
+  HttpConnectionProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new HttpConnectionProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _HttpConnectionProxyCalls(impl);
+  }
+
+  HttpConnectionProxy.fromHandle(core.MojoHandle handle) :
+      impl = new HttpConnectionProxyImpl.fromHandle(handle) {
+    ptr = new _HttpConnectionProxyCalls(impl);
+  }
+
+  HttpConnectionProxy.unbound() :
+      impl = new HttpConnectionProxyImpl.unbound() {
+    ptr = new _HttpConnectionProxyCalls(impl);
+  }
+
+  factory HttpConnectionProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    HttpConnectionProxy p = new HttpConnectionProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static HttpConnectionProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For HttpConnectionProxy"));
+    return new HttpConnectionProxy.fromEndpoint(endpoint);
+  }
+
+  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)";
+  }
+}
+
+
+class HttpConnectionStub extends bindings.Stub {
+  HttpConnection _impl = null;
+
+  HttpConnectionStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  HttpConnectionStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  HttpConnectionStub.unbound() : super.unbound();
+
+  static HttpConnectionStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For HttpConnectionStub"));
+    return new HttpConnectionStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = HttpConnectionName;
+
+
+  HttpConnectionSetSendBufferSizeResponseParams _HttpConnectionSetSendBufferSizeResponseParamsFactory(network_error_mojom.NetworkError result) {
+    var result = new HttpConnectionSetSendBufferSizeResponseParams();
+    result.result = result;
+    return result;
+  }
+  HttpConnectionSetReceiveBufferSizeResponseParams _HttpConnectionSetReceiveBufferSizeResponseParamsFactory(network_error_mojom.NetworkError result) {
+    var result = new HttpConnectionSetReceiveBufferSizeResponseParams();
+    result.result = result;
+    return result;
+  }
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      case kHttpConnection_setSendBufferSize_name:
+        var params = HttpConnectionSetSendBufferSizeParams.deserialize(
+            message.payload);
+        var response = _impl.setSendBufferSize(params.size,_HttpConnectionSetSendBufferSizeResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kHttpConnection_setSendBufferSize_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kHttpConnection_setSendBufferSize_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      case kHttpConnection_setReceiveBufferSize_name:
+        var params = HttpConnectionSetReceiveBufferSizeParams.deserialize(
+            message.payload);
+        var response = _impl.setReceiveBufferSize(params.size,_HttpConnectionSetReceiveBufferSizeResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kHttpConnection_setReceiveBufferSize_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kHttpConnection_setReceiveBufferSize_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  HttpConnection get impl => _impl;
+  set impl(HttpConnection d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "HttpConnectionStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+const int kHttpConnectionDelegate_onReceivedRequest_name = 0;
+const int kHttpConnectionDelegate_onReceivedWebSocketRequest_name = 1;
+
+const String HttpConnectionDelegateName =
+      'mojo::HttpConnectionDelegate';
+
+abstract class HttpConnectionDelegate {
+  dynamic onReceivedRequest(http_message_mojom.HttpRequest request,[Function responseFactory = null]);
+  dynamic onReceivedWebSocketRequest(http_message_mojom.HttpRequest request,[Function responseFactory = null]);
+
+}
+
+
+class HttpConnectionDelegateProxyImpl extends bindings.Proxy {
+  HttpConnectionDelegateProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  HttpConnectionDelegateProxyImpl.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);
+  }
+
+  String get name => HttpConnectionDelegateName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      case kHttpConnectionDelegate_onReceivedRequest_name:
+        var r = HttpConnectionDelegateOnReceivedRequestResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      case kHttpConnectionDelegate_onReceivedWebSocketRequest_name:
+        var r = HttpConnectionDelegateOnReceivedWebSocketRequestResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "HttpConnectionDelegateProxyImpl($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,
+          kHttpConnectionDelegate_onReceivedRequest_name,
+          -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,
+          kHttpConnectionDelegate_onReceivedWebSocketRequest_name,
+          -1,
+          bindings.MessageHeader.kMessageExpectsResponse);
+    }
+}
+
+
+class HttpConnectionDelegateProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  HttpConnectionDelegate ptr;
+  final String name = HttpConnectionDelegateName;
+
+  HttpConnectionDelegateProxy(HttpConnectionDelegateProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _HttpConnectionDelegateProxyCalls(proxyImpl);
+
+  HttpConnectionDelegateProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new HttpConnectionDelegateProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _HttpConnectionDelegateProxyCalls(impl);
+  }
+
+  HttpConnectionDelegateProxy.fromHandle(core.MojoHandle handle) :
+      impl = new HttpConnectionDelegateProxyImpl.fromHandle(handle) {
+    ptr = new _HttpConnectionDelegateProxyCalls(impl);
+  }
+
+  HttpConnectionDelegateProxy.unbound() :
+      impl = new HttpConnectionDelegateProxyImpl.unbound() {
+    ptr = new _HttpConnectionDelegateProxyCalls(impl);
+  }
+
+  factory HttpConnectionDelegateProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    HttpConnectionDelegateProxy p = new HttpConnectionDelegateProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static HttpConnectionDelegateProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For HttpConnectionDelegateProxy"));
+    return new HttpConnectionDelegateProxy.fromEndpoint(endpoint);
+  }
+
+  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)";
+  }
+}
+
+
+class HttpConnectionDelegateStub extends bindings.Stub {
+  HttpConnectionDelegate _impl = null;
+
+  HttpConnectionDelegateStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  HttpConnectionDelegateStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  HttpConnectionDelegateStub.unbound() : super.unbound();
+
+  static HttpConnectionDelegateStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For HttpConnectionDelegateStub"));
+    return new HttpConnectionDelegateStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = HttpConnectionDelegateName;
+
+
+  HttpConnectionDelegateOnReceivedRequestResponseParams _HttpConnectionDelegateOnReceivedRequestResponseParamsFactory(http_message_mojom.HttpResponse response) {
+    var result = new HttpConnectionDelegateOnReceivedRequestResponseParams();
+    result.response = response;
+    return result;
+  }
+  HttpConnectionDelegateOnReceivedWebSocketRequestResponseParams _HttpConnectionDelegateOnReceivedWebSocketRequestResponseParamsFactory(Object webSocket, core.MojoDataPipeConsumer sendStream, Object client) {
+    var result = new HttpConnectionDelegateOnReceivedWebSocketRequestResponseParams();
+    result.webSocket = webSocket;
+    result.sendStream = sendStream;
+    result.client = client;
+    return result;
+  }
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      case kHttpConnectionDelegate_onReceivedRequest_name:
+        var params = HttpConnectionDelegateOnReceivedRequestParams.deserialize(
+            message.payload);
+        var response = _impl.onReceivedRequest(params.request,_HttpConnectionDelegateOnReceivedRequestResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kHttpConnectionDelegate_onReceivedRequest_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kHttpConnectionDelegate_onReceivedRequest_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      case kHttpConnectionDelegate_onReceivedWebSocketRequest_name:
+        var params = HttpConnectionDelegateOnReceivedWebSocketRequestParams.deserialize(
+            message.payload);
+        var response = _impl.onReceivedWebSocketRequest(params.request,_HttpConnectionDelegateOnReceivedWebSocketRequestResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kHttpConnectionDelegate_onReceivedWebSocketRequest_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kHttpConnectionDelegate_onReceivedWebSocketRequest_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  HttpConnectionDelegate get impl => _impl;
+  set impl(HttpConnectionDelegate d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "HttpConnectionDelegateStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/http_message.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/http_message.mojom.dart
new file mode 100644
index 0000000..959db5c
--- /dev/null
+++ b/mojo/dart/packages/mojo_services/lib/mojo/http_message.mojom.dart
@@ -0,0 +1,224 @@
+// 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.
+
+library http_message_mojom;
+
+import 'dart:async';
+
+import 'package:mojo/bindings.dart' as bindings;
+import 'package:mojo/core.dart' as core;
+import 'package:mojo/mojo/http_header.mojom.dart' as http_header_mojom;
+
+
+
+class HttpRequest extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(40, 0)
+  ];
+  String method = "GET";
+  String url = null;
+  List<http_header_mojom.HttpHeader> headers = null;
+  core.MojoDataPipeConsumer body = null;
+
+  HttpRequest() : super(kVersions.last.size);
+
+  static HttpRequest deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static HttpRequest decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    HttpRequest result = new HttpRequest();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.method = decoder0.decodeString(8, false);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.url = decoder0.decodeString(16, false);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(24, true);
+      if (decoder1 == null) {
+        result.headers = null;
+      } else {
+        var si1 = decoder1.decodeDataHeaderForPointerArray(bindings.kUnspecifiedArrayLength);
+        result.headers = new List<http_header_mojom.HttpHeader>(si1.numElements);
+        for (int i1 = 0; i1 < si1.numElements; ++i1) {
+          
+          var decoder2 = decoder1.decodePointer(bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i1, false);
+          result.headers[i1] = http_header_mojom.HttpHeader.decode(decoder2);
+        }
+      }
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.body = decoder0.decodeConsumerHandle(32, true);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeString(method, 8, false);
+    
+    encoder0.encodeString(url, 16, false);
+    
+    if (headers == null) {
+      encoder0.encodeNullPointer(24, true);
+    } else {
+      var encoder1 = encoder0.encodePointerArray(headers.length, 24, bindings.kUnspecifiedArrayLength);
+      for (int i0 = 0; i0 < headers.length; ++i0) {
+        
+        encoder1.encodeStruct(headers[i0], bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i0, false);
+      }
+    }
+    
+    encoder0.encodeConsumerHandle(body, 32, true);
+  }
+
+  String toString() {
+    return "HttpRequest("
+           "method: $method" ", "
+           "url: $url" ", "
+           "headers: $headers" ", "
+           "body: $body" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+
+class HttpResponse extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  int statusCode = 200;
+  core.MojoDataPipeConsumer body = null;
+  List<http_header_mojom.HttpHeader> headers = null;
+
+  HttpResponse() : super(kVersions.last.size);
+
+  static HttpResponse deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static HttpResponse decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    HttpResponse result = new HttpResponse();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.statusCode = decoder0.decodeUint32(8);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.body = decoder0.decodeConsumerHandle(12, true);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(16, true);
+      if (decoder1 == null) {
+        result.headers = null;
+      } else {
+        var si1 = decoder1.decodeDataHeaderForPointerArray(bindings.kUnspecifiedArrayLength);
+        result.headers = new List<http_header_mojom.HttpHeader>(si1.numElements);
+        for (int i1 = 0; i1 < si1.numElements; ++i1) {
+          
+          var decoder2 = decoder1.decodePointer(bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i1, false);
+          result.headers[i1] = http_header_mojom.HttpHeader.decode(decoder2);
+        }
+      }
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeUint32(statusCode, 8);
+    
+    encoder0.encodeConsumerHandle(body, 12, true);
+    
+    if (headers == null) {
+      encoder0.encodeNullPointer(16, true);
+    } else {
+      var encoder1 = encoder0.encodePointerArray(headers.length, 16, bindings.kUnspecifiedArrayLength);
+      for (int i0 = 0; i0 < headers.length; ++i0) {
+        
+        encoder1.encodeStruct(headers[i0], bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i0, false);
+      }
+    }
+  }
+
+  String toString() {
+    return "HttpResponse("
+           "statusCode: $statusCode" ", "
+           "body: $body" ", "
+           "headers: $headers" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+
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
new file mode 100644
index 0000000..ee107e2
--- /dev/null
+++ b/mojo/dart/packages/mojo_services/lib/mojo/http_server.mojom.dart
@@ -0,0 +1,264 @@
+// 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.
+
+library http_server_mojom;
+
+import 'dart:async';
+
+import 'package:mojo/bindings.dart' as bindings;
+import 'package:mojo/core.dart' as core;
+import 'package:mojo_services/mojo/http_connection.mojom.dart' as http_connection_mojom;
+
+
+
+class HttpServerDelegateOnConnectedParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  Object connection = null;
+  Object delegate = null;
+
+  HttpServerDelegateOnConnectedParams() : super(kVersions.last.size);
+
+  static HttpServerDelegateOnConnectedParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static HttpServerDelegateOnConnectedParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    HttpServerDelegateOnConnectedParams result = new HttpServerDelegateOnConnectedParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.connection = decoder0.decodeServiceInterface(8, false, http_connection_mojom.HttpConnectionProxy.newFromEndpoint);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.delegate = decoder0.decodeInterfaceRequest(16, false, http_connection_mojom.HttpConnectionDelegateStub.newFromEndpoint);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeInterface(connection, 8, false);
+    
+    encoder0.encodeInterfaceRequest(delegate, 16, false);
+  }
+
+  String toString() {
+    return "HttpServerDelegateOnConnectedParams("
+           "connection: $connection" ", "
+           "delegate: $delegate" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+const int kHttpServerDelegate_onConnected_name = 0;
+
+const String HttpServerDelegateName =
+      'mojo::HttpServerDelegate';
+
+abstract class HttpServerDelegate {
+  void onConnected(Object connection, Object delegate);
+
+}
+
+
+class HttpServerDelegateProxyImpl extends bindings.Proxy {
+  HttpServerDelegateProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  HttpServerDelegateProxyImpl.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);
+  }
+
+  String get name => HttpServerDelegateName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "HttpServerDelegateProxyImpl($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, kHttpServerDelegate_onConnected_name);
+    }
+  
+}
+
+
+class HttpServerDelegateProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  HttpServerDelegate ptr;
+  final String name = HttpServerDelegateName;
+
+  HttpServerDelegateProxy(HttpServerDelegateProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _HttpServerDelegateProxyCalls(proxyImpl);
+
+  HttpServerDelegateProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new HttpServerDelegateProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _HttpServerDelegateProxyCalls(impl);
+  }
+
+  HttpServerDelegateProxy.fromHandle(core.MojoHandle handle) :
+      impl = new HttpServerDelegateProxyImpl.fromHandle(handle) {
+    ptr = new _HttpServerDelegateProxyCalls(impl);
+  }
+
+  HttpServerDelegateProxy.unbound() :
+      impl = new HttpServerDelegateProxyImpl.unbound() {
+    ptr = new _HttpServerDelegateProxyCalls(impl);
+  }
+
+  factory HttpServerDelegateProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    HttpServerDelegateProxy p = new HttpServerDelegateProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static HttpServerDelegateProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For HttpServerDelegateProxy"));
+    return new HttpServerDelegateProxy.fromEndpoint(endpoint);
+  }
+
+  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)";
+  }
+}
+
+
+class HttpServerDelegateStub extends bindings.Stub {
+  HttpServerDelegate _impl = null;
+
+  HttpServerDelegateStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  HttpServerDelegateStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  HttpServerDelegateStub.unbound() : super.unbound();
+
+  static HttpServerDelegateStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For HttpServerDelegateStub"));
+    return new HttpServerDelegateStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = HttpServerDelegateName;
+
+
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      case kHttpServerDelegate_onConnected_name:
+        var params = HttpServerDelegateOnConnectedParams.deserialize(
+            message.payload);
+        _impl.onConnected(params.connection, params.delegate);
+        break;
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  HttpServerDelegate get impl => _impl;
+  set impl(HttpServerDelegate d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "HttpServerDelegateStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/input_event_constants.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/input_event_constants.mojom.dart
new file mode 100644
index 0000000..757541a
--- /dev/null
+++ b/mojo/dart/packages/mojo_services/lib/mojo/input_event_constants.mojom.dart
@@ -0,0 +1,328 @@
+// 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.
+
+library input_event_constants_mojom;
+
+import 'dart:async';
+
+import 'package:mojo/bindings.dart' as bindings;
+import 'package:mojo/core.dart' as core;
+class EventType extends bindings.MojoEnum {
+  static const UNKNOWN = const EventType._(0);
+  static const KEY_PRESSED = const EventType._(1);
+  static const KEY_RELEASED = const EventType._(2);
+  static const POINTER_CANCEL = const EventType._(3);
+  static const POINTER_DOWN = const EventType._(4);
+  static const POINTER_MOVE = const EventType._(5);
+  static const POINTER_UP = const EventType._(6);
+
+  const EventType._(int v) : super(v);
+
+  static const Map<String, EventType> valuesMap = const {
+    "UNKNOWN": UNKNOWN,
+    "KEY_PRESSED": KEY_PRESSED,
+    "KEY_RELEASED": KEY_RELEASED,
+    "POINTER_CANCEL": POINTER_CANCEL,
+    "POINTER_DOWN": POINTER_DOWN,
+    "POINTER_MOVE": POINTER_MOVE,
+    "POINTER_UP": POINTER_UP,
+  };
+  static const List<EventType> values = const [
+    UNKNOWN,
+    KEY_PRESSED,
+    KEY_RELEASED,
+    POINTER_CANCEL,
+    POINTER_DOWN,
+    POINTER_MOVE,
+    POINTER_UP,
+  ];
+
+  static EventType valueOf(String name) => valuesMap[name];
+
+  factory EventType(int v) {
+    switch (v) {
+      case 0:
+        return UNKNOWN;
+      case 1:
+        return KEY_PRESSED;
+      case 2:
+        return KEY_RELEASED;
+      case 3:
+        return POINTER_CANCEL;
+      case 4:
+        return POINTER_DOWN;
+      case 5:
+        return POINTER_MOVE;
+      case 6:
+        return POINTER_UP;
+      default:
+        return null;
+    }
+  }
+
+  static EventType decode(bindings.Decoder decoder0, int offset) {
+    int v = decoder0.decodeUint32(offset);
+    EventType result = new EventType(v);
+    if (result == null) {
+      throw new bindings.MojoCodecError(
+          'Bad value $v for enum EventType.');
+    }
+    return result;
+  }
+
+  String toString() {
+    switch(this) {
+      case UNKNOWN:
+        return 'EventType.UNKNOWN';
+      case KEY_PRESSED:
+        return 'EventType.KEY_PRESSED';
+      case KEY_RELEASED:
+        return 'EventType.KEY_RELEASED';
+      case POINTER_CANCEL:
+        return 'EventType.POINTER_CANCEL';
+      case POINTER_DOWN:
+        return 'EventType.POINTER_DOWN';
+      case POINTER_MOVE:
+        return 'EventType.POINTER_MOVE';
+      case POINTER_UP:
+        return 'EventType.POINTER_UP';
+    }
+  }
+
+  int toJson() => value;
+}
+class EventFlags extends bindings.MojoEnum {
+  static const NONE = const EventFlags._(0);
+  static const CAPS_LOCK_DOWN = const EventFlags._(1);
+  static const SHIFT_DOWN = const EventFlags._(2);
+  static const CONTROL_DOWN = const EventFlags._(4);
+  static const ALT_DOWN = const EventFlags._(8);
+  static const LEFT_MOUSE_BUTTON = const EventFlags._(16);
+  static const MIDDLE_MOUSE_BUTTON = const EventFlags._(32);
+  static const RIGHT_MOUSE_BUTTON = const EventFlags._(64);
+  static const COMMAND_DOWN = const EventFlags._(128);
+  static const EXTENDED = const EventFlags._(256);
+  static const IS_SYNTHESIZED = const EventFlags._(512);
+  static const ALTGR_DOWN = const EventFlags._(1024);
+  static const MOD3_DOWN = const EventFlags._(2048);
+
+  const EventFlags._(int v) : super(v);
+
+  static const Map<String, EventFlags> valuesMap = const {
+    "NONE": NONE,
+    "CAPS_LOCK_DOWN": CAPS_LOCK_DOWN,
+    "SHIFT_DOWN": SHIFT_DOWN,
+    "CONTROL_DOWN": CONTROL_DOWN,
+    "ALT_DOWN": ALT_DOWN,
+    "LEFT_MOUSE_BUTTON": LEFT_MOUSE_BUTTON,
+    "MIDDLE_MOUSE_BUTTON": MIDDLE_MOUSE_BUTTON,
+    "RIGHT_MOUSE_BUTTON": RIGHT_MOUSE_BUTTON,
+    "COMMAND_DOWN": COMMAND_DOWN,
+    "EXTENDED": EXTENDED,
+    "IS_SYNTHESIZED": IS_SYNTHESIZED,
+    "ALTGR_DOWN": ALTGR_DOWN,
+    "MOD3_DOWN": MOD3_DOWN,
+  };
+  static const List<EventFlags> values = const [
+    NONE,
+    CAPS_LOCK_DOWN,
+    SHIFT_DOWN,
+    CONTROL_DOWN,
+    ALT_DOWN,
+    LEFT_MOUSE_BUTTON,
+    MIDDLE_MOUSE_BUTTON,
+    RIGHT_MOUSE_BUTTON,
+    COMMAND_DOWN,
+    EXTENDED,
+    IS_SYNTHESIZED,
+    ALTGR_DOWN,
+    MOD3_DOWN,
+  ];
+
+  static EventFlags valueOf(String name) => valuesMap[name];
+
+  factory EventFlags(int v) {
+    switch (v) {
+      case 0:
+        return NONE;
+      case 1:
+        return CAPS_LOCK_DOWN;
+      case 2:
+        return SHIFT_DOWN;
+      case 4:
+        return CONTROL_DOWN;
+      case 8:
+        return ALT_DOWN;
+      case 16:
+        return LEFT_MOUSE_BUTTON;
+      case 32:
+        return MIDDLE_MOUSE_BUTTON;
+      case 64:
+        return RIGHT_MOUSE_BUTTON;
+      case 128:
+        return COMMAND_DOWN;
+      case 256:
+        return EXTENDED;
+      case 512:
+        return IS_SYNTHESIZED;
+      case 1024:
+        return ALTGR_DOWN;
+      case 2048:
+        return MOD3_DOWN;
+      default:
+        return null;
+    }
+  }
+
+  static EventFlags decode(bindings.Decoder decoder0, int offset) {
+    int v = decoder0.decodeUint32(offset);
+    EventFlags result = new EventFlags(v);
+    if (result == null) {
+      throw new bindings.MojoCodecError(
+          'Bad value $v for enum EventFlags.');
+    }
+    return result;
+  }
+
+  String toString() {
+    switch(this) {
+      case NONE:
+        return 'EventFlags.NONE';
+      case CAPS_LOCK_DOWN:
+        return 'EventFlags.CAPS_LOCK_DOWN';
+      case SHIFT_DOWN:
+        return 'EventFlags.SHIFT_DOWN';
+      case CONTROL_DOWN:
+        return 'EventFlags.CONTROL_DOWN';
+      case ALT_DOWN:
+        return 'EventFlags.ALT_DOWN';
+      case LEFT_MOUSE_BUTTON:
+        return 'EventFlags.LEFT_MOUSE_BUTTON';
+      case MIDDLE_MOUSE_BUTTON:
+        return 'EventFlags.MIDDLE_MOUSE_BUTTON';
+      case RIGHT_MOUSE_BUTTON:
+        return 'EventFlags.RIGHT_MOUSE_BUTTON';
+      case COMMAND_DOWN:
+        return 'EventFlags.COMMAND_DOWN';
+      case EXTENDED:
+        return 'EventFlags.EXTENDED';
+      case IS_SYNTHESIZED:
+        return 'EventFlags.IS_SYNTHESIZED';
+      case ALTGR_DOWN:
+        return 'EventFlags.ALTGR_DOWN';
+      case MOD3_DOWN:
+        return 'EventFlags.MOD3_DOWN';
+    }
+  }
+
+  int toJson() => value;
+}
+class MouseEventFlags extends bindings.MojoEnum {
+  static const IS_DOUBLE_CLICK = const MouseEventFlags._(65536);
+  static const IS_TRIPLE_CLICK = const MouseEventFlags._(131072);
+  static const IS_NON_CLIENT = const MouseEventFlags._(262144);
+
+  const MouseEventFlags._(int v) : super(v);
+
+  static const Map<String, MouseEventFlags> valuesMap = const {
+    "IS_DOUBLE_CLICK": IS_DOUBLE_CLICK,
+    "IS_TRIPLE_CLICK": IS_TRIPLE_CLICK,
+    "IS_NON_CLIENT": IS_NON_CLIENT,
+  };
+  static const List<MouseEventFlags> values = const [
+    IS_DOUBLE_CLICK,
+    IS_TRIPLE_CLICK,
+    IS_NON_CLIENT,
+  ];
+
+  static MouseEventFlags valueOf(String name) => valuesMap[name];
+
+  factory MouseEventFlags(int v) {
+    switch (v) {
+      case 65536:
+        return IS_DOUBLE_CLICK;
+      case 131072:
+        return IS_TRIPLE_CLICK;
+      case 262144:
+        return IS_NON_CLIENT;
+      default:
+        return null;
+    }
+  }
+
+  static MouseEventFlags decode(bindings.Decoder decoder0, int offset) {
+    int v = decoder0.decodeUint32(offset);
+    MouseEventFlags result = new MouseEventFlags(v);
+    if (result == null) {
+      throw new bindings.MojoCodecError(
+          'Bad value $v for enum MouseEventFlags.');
+    }
+    return result;
+  }
+
+  String toString() {
+    switch(this) {
+      case IS_DOUBLE_CLICK:
+        return 'MouseEventFlags.IS_DOUBLE_CLICK';
+      case IS_TRIPLE_CLICK:
+        return 'MouseEventFlags.IS_TRIPLE_CLICK';
+      case IS_NON_CLIENT:
+        return 'MouseEventFlags.IS_NON_CLIENT';
+    }
+  }
+
+  int toJson() => value;
+}
+class PointerKind extends bindings.MojoEnum {
+  static const TOUCH = const PointerKind._(0);
+  static const MOUSE = const PointerKind._(1);
+
+  const PointerKind._(int v) : super(v);
+
+  static const Map<String, PointerKind> valuesMap = const {
+    "TOUCH": TOUCH,
+    "MOUSE": MOUSE,
+  };
+  static const List<PointerKind> values = const [
+    TOUCH,
+    MOUSE,
+  ];
+
+  static PointerKind valueOf(String name) => valuesMap[name];
+
+  factory PointerKind(int v) {
+    switch (v) {
+      case 0:
+        return TOUCH;
+      case 1:
+        return MOUSE;
+      default:
+        return null;
+    }
+  }
+
+  static PointerKind decode(bindings.Decoder decoder0, int offset) {
+    int v = decoder0.decodeUint32(offset);
+    PointerKind result = new PointerKind(v);
+    if (result == null) {
+      throw new bindings.MojoCodecError(
+          'Bad value $v for enum PointerKind.');
+    }
+    return result;
+  }
+
+  String toString() {
+    switch(this) {
+      case TOUCH:
+        return 'PointerKind.TOUCH';
+      case MOUSE:
+        return 'PointerKind.MOUSE';
+    }
+  }
+
+  int toJson() => value;
+}
+
+
+
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/input_events.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/input_events.mojom.dart
new file mode 100644
index 0000000..6ac0aeb
--- /dev/null
+++ b/mojo/dart/packages/mojo_services/lib/mojo/input_events.mojom.dart
@@ -0,0 +1,424 @@
+// 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.
+
+library input_events_mojom;
+
+import 'dart:async';
+
+import 'package:mojo/bindings.dart' as bindings;
+import 'package:mojo/core.dart' as core;
+import 'package:mojo_services/mojo/geometry.mojom.dart' as geometry_mojom;
+import 'package:mojo_services/mojo/input_event_constants.mojom.dart' as input_event_constants_mojom;
+import 'package:mojo_services/mojo/input_key_codes.mojom.dart' as input_key_codes_mojom;
+
+
+
+class KeyData extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(32, 0)
+  ];
+  int keyCode = 0;
+  bool isChar = false;
+  int character = 0;
+  input_key_codes_mojom.KeyboardCode windowsKeyCode = null;
+  int nativeKeyCode = 0;
+  int text = 0;
+  int unmodifiedText = 0;
+
+  KeyData() : super(kVersions.last.size);
+
+  static KeyData deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static KeyData decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    KeyData result = new KeyData();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.keyCode = decoder0.decodeInt32(8);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.isChar = decoder0.decodeBool(12, 0);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.character = decoder0.decodeUint16(14);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+        result.windowsKeyCode = input_key_codes_mojom.KeyboardCode.decode(decoder0, 16);
+        if (result.windowsKeyCode == null) {
+          throw new bindings.MojoCodecError(
+            'Trying to decode null union for non-nullable input_key_codes_mojom.KeyboardCode.');
+        }
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.nativeKeyCode = decoder0.decodeInt32(20);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.text = decoder0.decodeUint16(24);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.unmodifiedText = decoder0.decodeUint16(26);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeInt32(keyCode, 8);
+    
+    encoder0.encodeBool(isChar, 12, 0);
+    
+    encoder0.encodeUint16(character, 14);
+    
+    encoder0.encodeEnum(windowsKeyCode, 16);
+    
+    encoder0.encodeInt32(nativeKeyCode, 20);
+    
+    encoder0.encodeUint16(text, 24);
+    
+    encoder0.encodeUint16(unmodifiedText, 26);
+  }
+
+  String toString() {
+    return "KeyData("
+           "keyCode: $keyCode" ", "
+           "isChar: $isChar" ", "
+           "character: $character" ", "
+           "windowsKeyCode: $windowsKeyCode" ", "
+           "nativeKeyCode: $nativeKeyCode" ", "
+           "text: $text" ", "
+           "unmodifiedText: $unmodifiedText" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["keyCode"] = keyCode;
+    map["isChar"] = isChar;
+    map["character"] = character;
+    map["windowsKeyCode"] = windowsKeyCode;
+    map["nativeKeyCode"] = nativeKeyCode;
+    map["text"] = text;
+    map["unmodifiedText"] = unmodifiedText;
+    return map;
+  }
+}
+
+
+class PointerData extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(56, 0)
+  ];
+  int pointerId = 0;
+  input_event_constants_mojom.PointerKind kind = null;
+  double x = 0.0;
+  double y = 0.0;
+  double screenX = 0.0;
+  double screenY = 0.0;
+  double pressure = 0.0;
+  double radiusMajor = 0.0;
+  double radiusMinor = 0.0;
+  double orientation = 0.0;
+  double horizontalWheel = 0.0;
+  double verticalWheel = 0.0;
+
+  PointerData() : super(kVersions.last.size);
+
+  static PointerData deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static PointerData decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    PointerData result = new PointerData();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.pointerId = decoder0.decodeInt32(8);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+        result.kind = input_event_constants_mojom.PointerKind.decode(decoder0, 12);
+        if (result.kind == null) {
+          throw new bindings.MojoCodecError(
+            'Trying to decode null union for non-nullable input_event_constants_mojom.PointerKind.');
+        }
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.x = decoder0.decodeFloat(16);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.y = decoder0.decodeFloat(20);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.screenX = decoder0.decodeFloat(24);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.screenY = decoder0.decodeFloat(28);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.pressure = decoder0.decodeFloat(32);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.radiusMajor = decoder0.decodeFloat(36);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.radiusMinor = decoder0.decodeFloat(40);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.orientation = decoder0.decodeFloat(44);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.horizontalWheel = decoder0.decodeFloat(48);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.verticalWheel = decoder0.decodeFloat(52);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeInt32(pointerId, 8);
+    
+    encoder0.encodeEnum(kind, 12);
+    
+    encoder0.encodeFloat(x, 16);
+    
+    encoder0.encodeFloat(y, 20);
+    
+    encoder0.encodeFloat(screenX, 24);
+    
+    encoder0.encodeFloat(screenY, 28);
+    
+    encoder0.encodeFloat(pressure, 32);
+    
+    encoder0.encodeFloat(radiusMajor, 36);
+    
+    encoder0.encodeFloat(radiusMinor, 40);
+    
+    encoder0.encodeFloat(orientation, 44);
+    
+    encoder0.encodeFloat(horizontalWheel, 48);
+    
+    encoder0.encodeFloat(verticalWheel, 52);
+  }
+
+  String toString() {
+    return "PointerData("
+           "pointerId: $pointerId" ", "
+           "kind: $kind" ", "
+           "x: $x" ", "
+           "y: $y" ", "
+           "screenX: $screenX" ", "
+           "screenY: $screenY" ", "
+           "pressure: $pressure" ", "
+           "radiusMajor: $radiusMajor" ", "
+           "radiusMinor: $radiusMinor" ", "
+           "orientation: $orientation" ", "
+           "horizontalWheel: $horizontalWheel" ", "
+           "verticalWheel: $verticalWheel" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["pointerId"] = pointerId;
+    map["kind"] = kind;
+    map["x"] = x;
+    map["y"] = y;
+    map["screenX"] = screenX;
+    map["screenY"] = screenY;
+    map["pressure"] = pressure;
+    map["radiusMajor"] = radiusMajor;
+    map["radiusMinor"] = radiusMinor;
+    map["orientation"] = orientation;
+    map["horizontalWheel"] = horizontalWheel;
+    map["verticalWheel"] = verticalWheel;
+    return map;
+  }
+}
+
+
+class Event extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(40, 0)
+  ];
+  input_event_constants_mojom.EventType action = null;
+  input_event_constants_mojom.EventFlags flags = null;
+  int timeStamp = 0;
+  KeyData keyData = null;
+  PointerData pointerData = null;
+
+  Event() : super(kVersions.last.size);
+
+  static Event deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static Event decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    Event result = new Event();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+        result.action = input_event_constants_mojom.EventType.decode(decoder0, 8);
+        if (result.action == null) {
+          throw new bindings.MojoCodecError(
+            'Trying to decode null union for non-nullable input_event_constants_mojom.EventType.');
+        }
+    }
+    if (mainDataHeader.version >= 0) {
+      
+        result.flags = input_event_constants_mojom.EventFlags.decode(decoder0, 12);
+        if (result.flags == null) {
+          throw new bindings.MojoCodecError(
+            'Trying to decode null union for non-nullable input_event_constants_mojom.EventFlags.');
+        }
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.timeStamp = decoder0.decodeInt64(16);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(24, true);
+      result.keyData = KeyData.decode(decoder1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(32, true);
+      result.pointerData = PointerData.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeEnum(action, 8);
+    
+    encoder0.encodeEnum(flags, 12);
+    
+    encoder0.encodeInt64(timeStamp, 16);
+    
+    encoder0.encodeStruct(keyData, 24, true);
+    
+    encoder0.encodeStruct(pointerData, 32, true);
+  }
+
+  String toString() {
+    return "Event("
+           "action: $action" ", "
+           "flags: $flags" ", "
+           "timeStamp: $timeStamp" ", "
+           "keyData: $keyData" ", "
+           "pointerData: $pointerData" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["action"] = action;
+    map["flags"] = flags;
+    map["timeStamp"] = timeStamp;
+    map["keyData"] = keyData;
+    map["pointerData"] = pointerData;
+    return map;
+  }
+}
+
+
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/input_key_codes.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/input_key_codes.mojom.dart
new file mode 100644
index 0000000..04a8109
--- /dev/null
+++ b/mojo/dart/packages/mojo_services/lib/mojo/input_key_codes.mojom.dart
@@ -0,0 +1,1245 @@
+// 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.
+
+library input_key_codes_mojom;
+
+import 'dart:async';
+
+import 'package:mojo/bindings.dart' as bindings;
+import 'package:mojo/core.dart' as core;
+class KeyboardCode extends bindings.MojoEnum {
+  static const BACK = const KeyboardCode._(8);
+  static const TAB = const KeyboardCode._(9);
+  static const CLEAR = const KeyboardCode._(12);
+  static const RETURN = const KeyboardCode._(13);
+  static const SHIFT = const KeyboardCode._(16);
+  static const CONTROL = const KeyboardCode._(17);
+  static const MENU = const KeyboardCode._(18);
+  static const PAUSE = const KeyboardCode._(19);
+  static const CAPITAL = const KeyboardCode._(20);
+  static const KANA = const KeyboardCode._(21);
+  static const HANGUL = const KeyboardCode._(21);
+  static const JUNJA = const KeyboardCode._(23);
+  static const FINAL = const KeyboardCode._(24);
+  static const HANJA = const KeyboardCode._(25);
+  static const KANJI = const KeyboardCode._(25);
+  static const ESCAPE = const KeyboardCode._(27);
+  static const CONVERT = const KeyboardCode._(28);
+  static const NONCONVERT = const KeyboardCode._(29);
+  static const ACCEPT = const KeyboardCode._(30);
+  static const MODECHANGE = const KeyboardCode._(31);
+  static const SPACE = const KeyboardCode._(32);
+  static const PRIOR = const KeyboardCode._(33);
+  static const NEXT = const KeyboardCode._(34);
+  static const END = const KeyboardCode._(35);
+  static const HOME = const KeyboardCode._(36);
+  static const LEFT = const KeyboardCode._(37);
+  static const UP = const KeyboardCode._(38);
+  static const RIGHT = const KeyboardCode._(39);
+  static const DOWN = const KeyboardCode._(40);
+  static const SELECT = const KeyboardCode._(41);
+  static const PRINT = const KeyboardCode._(42);
+  static const EXECUTE = const KeyboardCode._(43);
+  static const SNAPSHOT = const KeyboardCode._(44);
+  static const INSERT = const KeyboardCode._(45);
+  static const DELETE = const KeyboardCode._(46);
+  static const HELP = const KeyboardCode._(47);
+  static const NUM_0 = const KeyboardCode._(48);
+  static const NUM_1 = const KeyboardCode._(49);
+  static const NUM_2 = const KeyboardCode._(50);
+  static const NUM_3 = const KeyboardCode._(51);
+  static const NUM_4 = const KeyboardCode._(52);
+  static const NUM_5 = const KeyboardCode._(53);
+  static const NUM_6 = const KeyboardCode._(54);
+  static const NUM_7 = const KeyboardCode._(55);
+  static const NUM_8 = const KeyboardCode._(56);
+  static const NUM_9 = const KeyboardCode._(57);
+  static const A = const KeyboardCode._(65);
+  static const B = const KeyboardCode._(66);
+  static const C = const KeyboardCode._(67);
+  static const D = const KeyboardCode._(68);
+  static const E = const KeyboardCode._(69);
+  static const F = const KeyboardCode._(70);
+  static const G = const KeyboardCode._(71);
+  static const H = const KeyboardCode._(72);
+  static const I = const KeyboardCode._(73);
+  static const J = const KeyboardCode._(74);
+  static const K = const KeyboardCode._(75);
+  static const L = const KeyboardCode._(76);
+  static const M = const KeyboardCode._(77);
+  static const N = const KeyboardCode._(78);
+  static const O = const KeyboardCode._(79);
+  static const P = const KeyboardCode._(80);
+  static const Q = const KeyboardCode._(81);
+  static const R = const KeyboardCode._(82);
+  static const S = const KeyboardCode._(83);
+  static const T = const KeyboardCode._(84);
+  static const U = const KeyboardCode._(85);
+  static const V = const KeyboardCode._(86);
+  static const W = const KeyboardCode._(87);
+  static const X = const KeyboardCode._(88);
+  static const Y = const KeyboardCode._(89);
+  static const Z = const KeyboardCode._(90);
+  static const LWIN = const KeyboardCode._(91);
+  static const COMMAND = const KeyboardCode._(91);
+  static const RWIN = const KeyboardCode._(92);
+  static const APPS = const KeyboardCode._(93);
+  static const SLEEP = const KeyboardCode._(95);
+  static const NUMPAD0 = const KeyboardCode._(96);
+  static const NUMPAD1 = const KeyboardCode._(97);
+  static const NUMPAD2 = const KeyboardCode._(98);
+  static const NUMPAD3 = const KeyboardCode._(99);
+  static const NUMPAD4 = const KeyboardCode._(100);
+  static const NUMPAD5 = const KeyboardCode._(101);
+  static const NUMPAD6 = const KeyboardCode._(102);
+  static const NUMPAD7 = const KeyboardCode._(103);
+  static const NUMPAD8 = const KeyboardCode._(104);
+  static const NUMPAD9 = const KeyboardCode._(105);
+  static const MULTIPLY = const KeyboardCode._(106);
+  static const ADD = const KeyboardCode._(107);
+  static const SEPARATOR = const KeyboardCode._(108);
+  static const SUBTRACT = const KeyboardCode._(109);
+  static const DECIMAL = const KeyboardCode._(110);
+  static const DIVIDE = const KeyboardCode._(111);
+  static const F1 = const KeyboardCode._(112);
+  static const F2 = const KeyboardCode._(113);
+  static const F3 = const KeyboardCode._(114);
+  static const F4 = const KeyboardCode._(115);
+  static const F5 = const KeyboardCode._(116);
+  static const F6 = const KeyboardCode._(117);
+  static const F7 = const KeyboardCode._(118);
+  static const F8 = const KeyboardCode._(119);
+  static const F9 = const KeyboardCode._(120);
+  static const F10 = const KeyboardCode._(121);
+  static const F11 = const KeyboardCode._(122);
+  static const F12 = const KeyboardCode._(123);
+  static const F13 = const KeyboardCode._(124);
+  static const F14 = const KeyboardCode._(125);
+  static const F15 = const KeyboardCode._(126);
+  static const F16 = const KeyboardCode._(127);
+  static const F17 = const KeyboardCode._(128);
+  static const F18 = const KeyboardCode._(129);
+  static const F19 = const KeyboardCode._(130);
+  static const F20 = const KeyboardCode._(131);
+  static const F21 = const KeyboardCode._(132);
+  static const F22 = const KeyboardCode._(133);
+  static const F23 = const KeyboardCode._(134);
+  static const F24 = const KeyboardCode._(135);
+  static const NUMLOCK = const KeyboardCode._(144);
+  static const SCROLL = const KeyboardCode._(145);
+  static const LSHIFT = const KeyboardCode._(160);
+  static const RSHIFT = const KeyboardCode._(161);
+  static const LCONTROL = const KeyboardCode._(162);
+  static const RCONTROL = const KeyboardCode._(163);
+  static const LMENU = const KeyboardCode._(164);
+  static const RMENU = const KeyboardCode._(165);
+  static const BROWSER_BACK = const KeyboardCode._(166);
+  static const BROWSER_FORWARD = const KeyboardCode._(167);
+  static const BROWSER_REFRESH = const KeyboardCode._(168);
+  static const BROWSER_STOP = const KeyboardCode._(169);
+  static const BROWSER_SEARCH = const KeyboardCode._(170);
+  static const BROWSER_FAVORITES = const KeyboardCode._(171);
+  static const BROWSER_HOME = const KeyboardCode._(172);
+  static const VOLUME_MUTE = const KeyboardCode._(173);
+  static const VOLUME_DOWN = const KeyboardCode._(174);
+  static const VOLUME_UP = const KeyboardCode._(175);
+  static const MEDIA_NEXT_TRACK = const KeyboardCode._(176);
+  static const MEDIA_PREV_TRACK = const KeyboardCode._(177);
+  static const MEDIA_STOP = const KeyboardCode._(178);
+  static const MEDIA_PLAY_PAUSE = const KeyboardCode._(179);
+  static const MEDIA_LAUNCH_MAIL = const KeyboardCode._(180);
+  static const MEDIA_LAUNCH_MEDIA_SELECT = const KeyboardCode._(181);
+  static const MEDIA_LAUNCH_APP1 = const KeyboardCode._(182);
+  static const MEDIA_LAUNCH_APP2 = const KeyboardCode._(183);
+  static const OEM_1 = const KeyboardCode._(186);
+  static const OEM_PLUS = const KeyboardCode._(187);
+  static const OEM_COMMA = const KeyboardCode._(188);
+  static const OEM_MINUS = const KeyboardCode._(189);
+  static const OEM_PERIOD = const KeyboardCode._(190);
+  static const OEM_2 = const KeyboardCode._(191);
+  static const OEM_3 = const KeyboardCode._(192);
+  static const OEM_4 = const KeyboardCode._(219);
+  static const OEM_5 = const KeyboardCode._(220);
+  static const OEM_6 = const KeyboardCode._(221);
+  static const OEM_7 = const KeyboardCode._(222);
+  static const OEM_8 = const KeyboardCode._(223);
+  static const OEM_102 = const KeyboardCode._(226);
+  static const PROCESSKEY = const KeyboardCode._(229);
+  static const PACKET = const KeyboardCode._(231);
+  static const DBE_SBCSCHAR = const KeyboardCode._(243);
+  static const DBE_DBCSCHAR = const KeyboardCode._(244);
+  static const ATTN = const KeyboardCode._(246);
+  static const CRSEL = const KeyboardCode._(247);
+  static const EXSEL = const KeyboardCode._(248);
+  static const EREOF = const KeyboardCode._(249);
+  static const PLAY = const KeyboardCode._(250);
+  static const ZOOM = const KeyboardCode._(251);
+  static const NONAME = const KeyboardCode._(252);
+  static const PA1 = const KeyboardCode._(253);
+  static const OEM_CLEAR = const KeyboardCode._(254);
+  static const UNKNOWN = const KeyboardCode._(0);
+  static const ALTGR = const KeyboardCode._(225);
+
+  const KeyboardCode._(int v) : super(v);
+
+  static const Map<String, KeyboardCode> valuesMap = const {
+    "BACK": BACK,
+    "TAB": TAB,
+    "CLEAR": CLEAR,
+    "RETURN": RETURN,
+    "SHIFT": SHIFT,
+    "CONTROL": CONTROL,
+    "MENU": MENU,
+    "PAUSE": PAUSE,
+    "CAPITAL": CAPITAL,
+    "KANA": KANA,
+    "HANGUL": HANGUL,
+    "JUNJA": JUNJA,
+    "FINAL": FINAL,
+    "HANJA": HANJA,
+    "KANJI": KANJI,
+    "ESCAPE": ESCAPE,
+    "CONVERT": CONVERT,
+    "NONCONVERT": NONCONVERT,
+    "ACCEPT": ACCEPT,
+    "MODECHANGE": MODECHANGE,
+    "SPACE": SPACE,
+    "PRIOR": PRIOR,
+    "NEXT": NEXT,
+    "END": END,
+    "HOME": HOME,
+    "LEFT": LEFT,
+    "UP": UP,
+    "RIGHT": RIGHT,
+    "DOWN": DOWN,
+    "SELECT": SELECT,
+    "PRINT": PRINT,
+    "EXECUTE": EXECUTE,
+    "SNAPSHOT": SNAPSHOT,
+    "INSERT": INSERT,
+    "DELETE": DELETE,
+    "HELP": HELP,
+    "NUM_0": NUM_0,
+    "NUM_1": NUM_1,
+    "NUM_2": NUM_2,
+    "NUM_3": NUM_3,
+    "NUM_4": NUM_4,
+    "NUM_5": NUM_5,
+    "NUM_6": NUM_6,
+    "NUM_7": NUM_7,
+    "NUM_8": NUM_8,
+    "NUM_9": NUM_9,
+    "A": A,
+    "B": B,
+    "C": C,
+    "D": D,
+    "E": E,
+    "F": F,
+    "G": G,
+    "H": H,
+    "I": I,
+    "J": J,
+    "K": K,
+    "L": L,
+    "M": M,
+    "N": N,
+    "O": O,
+    "P": P,
+    "Q": Q,
+    "R": R,
+    "S": S,
+    "T": T,
+    "U": U,
+    "V": V,
+    "W": W,
+    "X": X,
+    "Y": Y,
+    "Z": Z,
+    "LWIN": LWIN,
+    "COMMAND": COMMAND,
+    "RWIN": RWIN,
+    "APPS": APPS,
+    "SLEEP": SLEEP,
+    "NUMPAD0": NUMPAD0,
+    "NUMPAD1": NUMPAD1,
+    "NUMPAD2": NUMPAD2,
+    "NUMPAD3": NUMPAD3,
+    "NUMPAD4": NUMPAD4,
+    "NUMPAD5": NUMPAD5,
+    "NUMPAD6": NUMPAD6,
+    "NUMPAD7": NUMPAD7,
+    "NUMPAD8": NUMPAD8,
+    "NUMPAD9": NUMPAD9,
+    "MULTIPLY": MULTIPLY,
+    "ADD": ADD,
+    "SEPARATOR": SEPARATOR,
+    "SUBTRACT": SUBTRACT,
+    "DECIMAL": DECIMAL,
+    "DIVIDE": DIVIDE,
+    "F1": F1,
+    "F2": F2,
+    "F3": F3,
+    "F4": F4,
+    "F5": F5,
+    "F6": F6,
+    "F7": F7,
+    "F8": F8,
+    "F9": F9,
+    "F10": F10,
+    "F11": F11,
+    "F12": F12,
+    "F13": F13,
+    "F14": F14,
+    "F15": F15,
+    "F16": F16,
+    "F17": F17,
+    "F18": F18,
+    "F19": F19,
+    "F20": F20,
+    "F21": F21,
+    "F22": F22,
+    "F23": F23,
+    "F24": F24,
+    "NUMLOCK": NUMLOCK,
+    "SCROLL": SCROLL,
+    "LSHIFT": LSHIFT,
+    "RSHIFT": RSHIFT,
+    "LCONTROL": LCONTROL,
+    "RCONTROL": RCONTROL,
+    "LMENU": LMENU,
+    "RMENU": RMENU,
+    "BROWSER_BACK": BROWSER_BACK,
+    "BROWSER_FORWARD": BROWSER_FORWARD,
+    "BROWSER_REFRESH": BROWSER_REFRESH,
+    "BROWSER_STOP": BROWSER_STOP,
+    "BROWSER_SEARCH": BROWSER_SEARCH,
+    "BROWSER_FAVORITES": BROWSER_FAVORITES,
+    "BROWSER_HOME": BROWSER_HOME,
+    "VOLUME_MUTE": VOLUME_MUTE,
+    "VOLUME_DOWN": VOLUME_DOWN,
+    "VOLUME_UP": VOLUME_UP,
+    "MEDIA_NEXT_TRACK": MEDIA_NEXT_TRACK,
+    "MEDIA_PREV_TRACK": MEDIA_PREV_TRACK,
+    "MEDIA_STOP": MEDIA_STOP,
+    "MEDIA_PLAY_PAUSE": MEDIA_PLAY_PAUSE,
+    "MEDIA_LAUNCH_MAIL": MEDIA_LAUNCH_MAIL,
+    "MEDIA_LAUNCH_MEDIA_SELECT": MEDIA_LAUNCH_MEDIA_SELECT,
+    "MEDIA_LAUNCH_APP1": MEDIA_LAUNCH_APP1,
+    "MEDIA_LAUNCH_APP2": MEDIA_LAUNCH_APP2,
+    "OEM_1": OEM_1,
+    "OEM_PLUS": OEM_PLUS,
+    "OEM_COMMA": OEM_COMMA,
+    "OEM_MINUS": OEM_MINUS,
+    "OEM_PERIOD": OEM_PERIOD,
+    "OEM_2": OEM_2,
+    "OEM_3": OEM_3,
+    "OEM_4": OEM_4,
+    "OEM_5": OEM_5,
+    "OEM_6": OEM_6,
+    "OEM_7": OEM_7,
+    "OEM_8": OEM_8,
+    "OEM_102": OEM_102,
+    "PROCESSKEY": PROCESSKEY,
+    "PACKET": PACKET,
+    "DBE_SBCSCHAR": DBE_SBCSCHAR,
+    "DBE_DBCSCHAR": DBE_DBCSCHAR,
+    "ATTN": ATTN,
+    "CRSEL": CRSEL,
+    "EXSEL": EXSEL,
+    "EREOF": EREOF,
+    "PLAY": PLAY,
+    "ZOOM": ZOOM,
+    "NONAME": NONAME,
+    "PA1": PA1,
+    "OEM_CLEAR": OEM_CLEAR,
+    "UNKNOWN": UNKNOWN,
+    "ALTGR": ALTGR,
+  };
+  static const List<KeyboardCode> values = const [
+    BACK,
+    TAB,
+    CLEAR,
+    RETURN,
+    SHIFT,
+    CONTROL,
+    MENU,
+    PAUSE,
+    CAPITAL,
+    KANA,
+    HANGUL,
+    JUNJA,
+    FINAL,
+    HANJA,
+    KANJI,
+    ESCAPE,
+    CONVERT,
+    NONCONVERT,
+    ACCEPT,
+    MODECHANGE,
+    SPACE,
+    PRIOR,
+    NEXT,
+    END,
+    HOME,
+    LEFT,
+    UP,
+    RIGHT,
+    DOWN,
+    SELECT,
+    PRINT,
+    EXECUTE,
+    SNAPSHOT,
+    INSERT,
+    DELETE,
+    HELP,
+    NUM_0,
+    NUM_1,
+    NUM_2,
+    NUM_3,
+    NUM_4,
+    NUM_5,
+    NUM_6,
+    NUM_7,
+    NUM_8,
+    NUM_9,
+    A,
+    B,
+    C,
+    D,
+    E,
+    F,
+    G,
+    H,
+    I,
+    J,
+    K,
+    L,
+    M,
+    N,
+    O,
+    P,
+    Q,
+    R,
+    S,
+    T,
+    U,
+    V,
+    W,
+    X,
+    Y,
+    Z,
+    LWIN,
+    COMMAND,
+    RWIN,
+    APPS,
+    SLEEP,
+    NUMPAD0,
+    NUMPAD1,
+    NUMPAD2,
+    NUMPAD3,
+    NUMPAD4,
+    NUMPAD5,
+    NUMPAD6,
+    NUMPAD7,
+    NUMPAD8,
+    NUMPAD9,
+    MULTIPLY,
+    ADD,
+    SEPARATOR,
+    SUBTRACT,
+    DECIMAL,
+    DIVIDE,
+    F1,
+    F2,
+    F3,
+    F4,
+    F5,
+    F6,
+    F7,
+    F8,
+    F9,
+    F10,
+    F11,
+    F12,
+    F13,
+    F14,
+    F15,
+    F16,
+    F17,
+    F18,
+    F19,
+    F20,
+    F21,
+    F22,
+    F23,
+    F24,
+    NUMLOCK,
+    SCROLL,
+    LSHIFT,
+    RSHIFT,
+    LCONTROL,
+    RCONTROL,
+    LMENU,
+    RMENU,
+    BROWSER_BACK,
+    BROWSER_FORWARD,
+    BROWSER_REFRESH,
+    BROWSER_STOP,
+    BROWSER_SEARCH,
+    BROWSER_FAVORITES,
+    BROWSER_HOME,
+    VOLUME_MUTE,
+    VOLUME_DOWN,
+    VOLUME_UP,
+    MEDIA_NEXT_TRACK,
+    MEDIA_PREV_TRACK,
+    MEDIA_STOP,
+    MEDIA_PLAY_PAUSE,
+    MEDIA_LAUNCH_MAIL,
+    MEDIA_LAUNCH_MEDIA_SELECT,
+    MEDIA_LAUNCH_APP1,
+    MEDIA_LAUNCH_APP2,
+    OEM_1,
+    OEM_PLUS,
+    OEM_COMMA,
+    OEM_MINUS,
+    OEM_PERIOD,
+    OEM_2,
+    OEM_3,
+    OEM_4,
+    OEM_5,
+    OEM_6,
+    OEM_7,
+    OEM_8,
+    OEM_102,
+    PROCESSKEY,
+    PACKET,
+    DBE_SBCSCHAR,
+    DBE_DBCSCHAR,
+    ATTN,
+    CRSEL,
+    EXSEL,
+    EREOF,
+    PLAY,
+    ZOOM,
+    NONAME,
+    PA1,
+    OEM_CLEAR,
+    UNKNOWN,
+    ALTGR,
+  ];
+
+  static KeyboardCode valueOf(String name) => valuesMap[name];
+
+  factory KeyboardCode(int v) {
+    switch (v) {
+      case 8:
+        return BACK;
+      case 9:
+        return TAB;
+      case 12:
+        return CLEAR;
+      case 13:
+        return RETURN;
+      case 16:
+        return SHIFT;
+      case 17:
+        return CONTROL;
+      case 18:
+        return MENU;
+      case 19:
+        return PAUSE;
+      case 20:
+        return CAPITAL;
+      case 21:
+        return KANA;
+      case 21:
+        return HANGUL;
+      case 23:
+        return JUNJA;
+      case 24:
+        return FINAL;
+      case 25:
+        return HANJA;
+      case 25:
+        return KANJI;
+      case 27:
+        return ESCAPE;
+      case 28:
+        return CONVERT;
+      case 29:
+        return NONCONVERT;
+      case 30:
+        return ACCEPT;
+      case 31:
+        return MODECHANGE;
+      case 32:
+        return SPACE;
+      case 33:
+        return PRIOR;
+      case 34:
+        return NEXT;
+      case 35:
+        return END;
+      case 36:
+        return HOME;
+      case 37:
+        return LEFT;
+      case 38:
+        return UP;
+      case 39:
+        return RIGHT;
+      case 40:
+        return DOWN;
+      case 41:
+        return SELECT;
+      case 42:
+        return PRINT;
+      case 43:
+        return EXECUTE;
+      case 44:
+        return SNAPSHOT;
+      case 45:
+        return INSERT;
+      case 46:
+        return DELETE;
+      case 47:
+        return HELP;
+      case 48:
+        return NUM_0;
+      case 49:
+        return NUM_1;
+      case 50:
+        return NUM_2;
+      case 51:
+        return NUM_3;
+      case 52:
+        return NUM_4;
+      case 53:
+        return NUM_5;
+      case 54:
+        return NUM_6;
+      case 55:
+        return NUM_7;
+      case 56:
+        return NUM_8;
+      case 57:
+        return NUM_9;
+      case 65:
+        return A;
+      case 66:
+        return B;
+      case 67:
+        return C;
+      case 68:
+        return D;
+      case 69:
+        return E;
+      case 70:
+        return F;
+      case 71:
+        return G;
+      case 72:
+        return H;
+      case 73:
+        return I;
+      case 74:
+        return J;
+      case 75:
+        return K;
+      case 76:
+        return L;
+      case 77:
+        return M;
+      case 78:
+        return N;
+      case 79:
+        return O;
+      case 80:
+        return P;
+      case 81:
+        return Q;
+      case 82:
+        return R;
+      case 83:
+        return S;
+      case 84:
+        return T;
+      case 85:
+        return U;
+      case 86:
+        return V;
+      case 87:
+        return W;
+      case 88:
+        return X;
+      case 89:
+        return Y;
+      case 90:
+        return Z;
+      case 91:
+        return LWIN;
+      case 91:
+        return COMMAND;
+      case 92:
+        return RWIN;
+      case 93:
+        return APPS;
+      case 95:
+        return SLEEP;
+      case 96:
+        return NUMPAD0;
+      case 97:
+        return NUMPAD1;
+      case 98:
+        return NUMPAD2;
+      case 99:
+        return NUMPAD3;
+      case 100:
+        return NUMPAD4;
+      case 101:
+        return NUMPAD5;
+      case 102:
+        return NUMPAD6;
+      case 103:
+        return NUMPAD7;
+      case 104:
+        return NUMPAD8;
+      case 105:
+        return NUMPAD9;
+      case 106:
+        return MULTIPLY;
+      case 107:
+        return ADD;
+      case 108:
+        return SEPARATOR;
+      case 109:
+        return SUBTRACT;
+      case 110:
+        return DECIMAL;
+      case 111:
+        return DIVIDE;
+      case 112:
+        return F1;
+      case 113:
+        return F2;
+      case 114:
+        return F3;
+      case 115:
+        return F4;
+      case 116:
+        return F5;
+      case 117:
+        return F6;
+      case 118:
+        return F7;
+      case 119:
+        return F8;
+      case 120:
+        return F9;
+      case 121:
+        return F10;
+      case 122:
+        return F11;
+      case 123:
+        return F12;
+      case 124:
+        return F13;
+      case 125:
+        return F14;
+      case 126:
+        return F15;
+      case 127:
+        return F16;
+      case 128:
+        return F17;
+      case 129:
+        return F18;
+      case 130:
+        return F19;
+      case 131:
+        return F20;
+      case 132:
+        return F21;
+      case 133:
+        return F22;
+      case 134:
+        return F23;
+      case 135:
+        return F24;
+      case 144:
+        return NUMLOCK;
+      case 145:
+        return SCROLL;
+      case 160:
+        return LSHIFT;
+      case 161:
+        return RSHIFT;
+      case 162:
+        return LCONTROL;
+      case 163:
+        return RCONTROL;
+      case 164:
+        return LMENU;
+      case 165:
+        return RMENU;
+      case 166:
+        return BROWSER_BACK;
+      case 167:
+        return BROWSER_FORWARD;
+      case 168:
+        return BROWSER_REFRESH;
+      case 169:
+        return BROWSER_STOP;
+      case 170:
+        return BROWSER_SEARCH;
+      case 171:
+        return BROWSER_FAVORITES;
+      case 172:
+        return BROWSER_HOME;
+      case 173:
+        return VOLUME_MUTE;
+      case 174:
+        return VOLUME_DOWN;
+      case 175:
+        return VOLUME_UP;
+      case 176:
+        return MEDIA_NEXT_TRACK;
+      case 177:
+        return MEDIA_PREV_TRACK;
+      case 178:
+        return MEDIA_STOP;
+      case 179:
+        return MEDIA_PLAY_PAUSE;
+      case 180:
+        return MEDIA_LAUNCH_MAIL;
+      case 181:
+        return MEDIA_LAUNCH_MEDIA_SELECT;
+      case 182:
+        return MEDIA_LAUNCH_APP1;
+      case 183:
+        return MEDIA_LAUNCH_APP2;
+      case 186:
+        return OEM_1;
+      case 187:
+        return OEM_PLUS;
+      case 188:
+        return OEM_COMMA;
+      case 189:
+        return OEM_MINUS;
+      case 190:
+        return OEM_PERIOD;
+      case 191:
+        return OEM_2;
+      case 192:
+        return OEM_3;
+      case 219:
+        return OEM_4;
+      case 220:
+        return OEM_5;
+      case 221:
+        return OEM_6;
+      case 222:
+        return OEM_7;
+      case 223:
+        return OEM_8;
+      case 226:
+        return OEM_102;
+      case 229:
+        return PROCESSKEY;
+      case 231:
+        return PACKET;
+      case 243:
+        return DBE_SBCSCHAR;
+      case 244:
+        return DBE_DBCSCHAR;
+      case 246:
+        return ATTN;
+      case 247:
+        return CRSEL;
+      case 248:
+        return EXSEL;
+      case 249:
+        return EREOF;
+      case 250:
+        return PLAY;
+      case 251:
+        return ZOOM;
+      case 252:
+        return NONAME;
+      case 253:
+        return PA1;
+      case 254:
+        return OEM_CLEAR;
+      case 0:
+        return UNKNOWN;
+      case 225:
+        return ALTGR;
+      default:
+        return null;
+    }
+  }
+
+  static KeyboardCode decode(bindings.Decoder decoder0, int offset) {
+    int v = decoder0.decodeUint32(offset);
+    KeyboardCode result = new KeyboardCode(v);
+    if (result == null) {
+      throw new bindings.MojoCodecError(
+          'Bad value $v for enum KeyboardCode.');
+    }
+    return result;
+  }
+
+  String toString() {
+    switch(this) {
+      case BACK:
+        return 'KeyboardCode.BACK';
+      case TAB:
+        return 'KeyboardCode.TAB';
+      case CLEAR:
+        return 'KeyboardCode.CLEAR';
+      case RETURN:
+        return 'KeyboardCode.RETURN';
+      case SHIFT:
+        return 'KeyboardCode.SHIFT';
+      case CONTROL:
+        return 'KeyboardCode.CONTROL';
+      case MENU:
+        return 'KeyboardCode.MENU';
+      case PAUSE:
+        return 'KeyboardCode.PAUSE';
+      case CAPITAL:
+        return 'KeyboardCode.CAPITAL';
+      case KANA:
+        return 'KeyboardCode.KANA';
+      case HANGUL:
+        return 'KeyboardCode.HANGUL';
+      case JUNJA:
+        return 'KeyboardCode.JUNJA';
+      case FINAL:
+        return 'KeyboardCode.FINAL';
+      case HANJA:
+        return 'KeyboardCode.HANJA';
+      case KANJI:
+        return 'KeyboardCode.KANJI';
+      case ESCAPE:
+        return 'KeyboardCode.ESCAPE';
+      case CONVERT:
+        return 'KeyboardCode.CONVERT';
+      case NONCONVERT:
+        return 'KeyboardCode.NONCONVERT';
+      case ACCEPT:
+        return 'KeyboardCode.ACCEPT';
+      case MODECHANGE:
+        return 'KeyboardCode.MODECHANGE';
+      case SPACE:
+        return 'KeyboardCode.SPACE';
+      case PRIOR:
+        return 'KeyboardCode.PRIOR';
+      case NEXT:
+        return 'KeyboardCode.NEXT';
+      case END:
+        return 'KeyboardCode.END';
+      case HOME:
+        return 'KeyboardCode.HOME';
+      case LEFT:
+        return 'KeyboardCode.LEFT';
+      case UP:
+        return 'KeyboardCode.UP';
+      case RIGHT:
+        return 'KeyboardCode.RIGHT';
+      case DOWN:
+        return 'KeyboardCode.DOWN';
+      case SELECT:
+        return 'KeyboardCode.SELECT';
+      case PRINT:
+        return 'KeyboardCode.PRINT';
+      case EXECUTE:
+        return 'KeyboardCode.EXECUTE';
+      case SNAPSHOT:
+        return 'KeyboardCode.SNAPSHOT';
+      case INSERT:
+        return 'KeyboardCode.INSERT';
+      case DELETE:
+        return 'KeyboardCode.DELETE';
+      case HELP:
+        return 'KeyboardCode.HELP';
+      case NUM_0:
+        return 'KeyboardCode.NUM_0';
+      case NUM_1:
+        return 'KeyboardCode.NUM_1';
+      case NUM_2:
+        return 'KeyboardCode.NUM_2';
+      case NUM_3:
+        return 'KeyboardCode.NUM_3';
+      case NUM_4:
+        return 'KeyboardCode.NUM_4';
+      case NUM_5:
+        return 'KeyboardCode.NUM_5';
+      case NUM_6:
+        return 'KeyboardCode.NUM_6';
+      case NUM_7:
+        return 'KeyboardCode.NUM_7';
+      case NUM_8:
+        return 'KeyboardCode.NUM_8';
+      case NUM_9:
+        return 'KeyboardCode.NUM_9';
+      case A:
+        return 'KeyboardCode.A';
+      case B:
+        return 'KeyboardCode.B';
+      case C:
+        return 'KeyboardCode.C';
+      case D:
+        return 'KeyboardCode.D';
+      case E:
+        return 'KeyboardCode.E';
+      case F:
+        return 'KeyboardCode.F';
+      case G:
+        return 'KeyboardCode.G';
+      case H:
+        return 'KeyboardCode.H';
+      case I:
+        return 'KeyboardCode.I';
+      case J:
+        return 'KeyboardCode.J';
+      case K:
+        return 'KeyboardCode.K';
+      case L:
+        return 'KeyboardCode.L';
+      case M:
+        return 'KeyboardCode.M';
+      case N:
+        return 'KeyboardCode.N';
+      case O:
+        return 'KeyboardCode.O';
+      case P:
+        return 'KeyboardCode.P';
+      case Q:
+        return 'KeyboardCode.Q';
+      case R:
+        return 'KeyboardCode.R';
+      case S:
+        return 'KeyboardCode.S';
+      case T:
+        return 'KeyboardCode.T';
+      case U:
+        return 'KeyboardCode.U';
+      case V:
+        return 'KeyboardCode.V';
+      case W:
+        return 'KeyboardCode.W';
+      case X:
+        return 'KeyboardCode.X';
+      case Y:
+        return 'KeyboardCode.Y';
+      case Z:
+        return 'KeyboardCode.Z';
+      case LWIN:
+        return 'KeyboardCode.LWIN';
+      case COMMAND:
+        return 'KeyboardCode.COMMAND';
+      case RWIN:
+        return 'KeyboardCode.RWIN';
+      case APPS:
+        return 'KeyboardCode.APPS';
+      case SLEEP:
+        return 'KeyboardCode.SLEEP';
+      case NUMPAD0:
+        return 'KeyboardCode.NUMPAD0';
+      case NUMPAD1:
+        return 'KeyboardCode.NUMPAD1';
+      case NUMPAD2:
+        return 'KeyboardCode.NUMPAD2';
+      case NUMPAD3:
+        return 'KeyboardCode.NUMPAD3';
+      case NUMPAD4:
+        return 'KeyboardCode.NUMPAD4';
+      case NUMPAD5:
+        return 'KeyboardCode.NUMPAD5';
+      case NUMPAD6:
+        return 'KeyboardCode.NUMPAD6';
+      case NUMPAD7:
+        return 'KeyboardCode.NUMPAD7';
+      case NUMPAD8:
+        return 'KeyboardCode.NUMPAD8';
+      case NUMPAD9:
+        return 'KeyboardCode.NUMPAD9';
+      case MULTIPLY:
+        return 'KeyboardCode.MULTIPLY';
+      case ADD:
+        return 'KeyboardCode.ADD';
+      case SEPARATOR:
+        return 'KeyboardCode.SEPARATOR';
+      case SUBTRACT:
+        return 'KeyboardCode.SUBTRACT';
+      case DECIMAL:
+        return 'KeyboardCode.DECIMAL';
+      case DIVIDE:
+        return 'KeyboardCode.DIVIDE';
+      case F1:
+        return 'KeyboardCode.F1';
+      case F2:
+        return 'KeyboardCode.F2';
+      case F3:
+        return 'KeyboardCode.F3';
+      case F4:
+        return 'KeyboardCode.F4';
+      case F5:
+        return 'KeyboardCode.F5';
+      case F6:
+        return 'KeyboardCode.F6';
+      case F7:
+        return 'KeyboardCode.F7';
+      case F8:
+        return 'KeyboardCode.F8';
+      case F9:
+        return 'KeyboardCode.F9';
+      case F10:
+        return 'KeyboardCode.F10';
+      case F11:
+        return 'KeyboardCode.F11';
+      case F12:
+        return 'KeyboardCode.F12';
+      case F13:
+        return 'KeyboardCode.F13';
+      case F14:
+        return 'KeyboardCode.F14';
+      case F15:
+        return 'KeyboardCode.F15';
+      case F16:
+        return 'KeyboardCode.F16';
+      case F17:
+        return 'KeyboardCode.F17';
+      case F18:
+        return 'KeyboardCode.F18';
+      case F19:
+        return 'KeyboardCode.F19';
+      case F20:
+        return 'KeyboardCode.F20';
+      case F21:
+        return 'KeyboardCode.F21';
+      case F22:
+        return 'KeyboardCode.F22';
+      case F23:
+        return 'KeyboardCode.F23';
+      case F24:
+        return 'KeyboardCode.F24';
+      case NUMLOCK:
+        return 'KeyboardCode.NUMLOCK';
+      case SCROLL:
+        return 'KeyboardCode.SCROLL';
+      case LSHIFT:
+        return 'KeyboardCode.LSHIFT';
+      case RSHIFT:
+        return 'KeyboardCode.RSHIFT';
+      case LCONTROL:
+        return 'KeyboardCode.LCONTROL';
+      case RCONTROL:
+        return 'KeyboardCode.RCONTROL';
+      case LMENU:
+        return 'KeyboardCode.LMENU';
+      case RMENU:
+        return 'KeyboardCode.RMENU';
+      case BROWSER_BACK:
+        return 'KeyboardCode.BROWSER_BACK';
+      case BROWSER_FORWARD:
+        return 'KeyboardCode.BROWSER_FORWARD';
+      case BROWSER_REFRESH:
+        return 'KeyboardCode.BROWSER_REFRESH';
+      case BROWSER_STOP:
+        return 'KeyboardCode.BROWSER_STOP';
+      case BROWSER_SEARCH:
+        return 'KeyboardCode.BROWSER_SEARCH';
+      case BROWSER_FAVORITES:
+        return 'KeyboardCode.BROWSER_FAVORITES';
+      case BROWSER_HOME:
+        return 'KeyboardCode.BROWSER_HOME';
+      case VOLUME_MUTE:
+        return 'KeyboardCode.VOLUME_MUTE';
+      case VOLUME_DOWN:
+        return 'KeyboardCode.VOLUME_DOWN';
+      case VOLUME_UP:
+        return 'KeyboardCode.VOLUME_UP';
+      case MEDIA_NEXT_TRACK:
+        return 'KeyboardCode.MEDIA_NEXT_TRACK';
+      case MEDIA_PREV_TRACK:
+        return 'KeyboardCode.MEDIA_PREV_TRACK';
+      case MEDIA_STOP:
+        return 'KeyboardCode.MEDIA_STOP';
+      case MEDIA_PLAY_PAUSE:
+        return 'KeyboardCode.MEDIA_PLAY_PAUSE';
+      case MEDIA_LAUNCH_MAIL:
+        return 'KeyboardCode.MEDIA_LAUNCH_MAIL';
+      case MEDIA_LAUNCH_MEDIA_SELECT:
+        return 'KeyboardCode.MEDIA_LAUNCH_MEDIA_SELECT';
+      case MEDIA_LAUNCH_APP1:
+        return 'KeyboardCode.MEDIA_LAUNCH_APP1';
+      case MEDIA_LAUNCH_APP2:
+        return 'KeyboardCode.MEDIA_LAUNCH_APP2';
+      case OEM_1:
+        return 'KeyboardCode.OEM_1';
+      case OEM_PLUS:
+        return 'KeyboardCode.OEM_PLUS';
+      case OEM_COMMA:
+        return 'KeyboardCode.OEM_COMMA';
+      case OEM_MINUS:
+        return 'KeyboardCode.OEM_MINUS';
+      case OEM_PERIOD:
+        return 'KeyboardCode.OEM_PERIOD';
+      case OEM_2:
+        return 'KeyboardCode.OEM_2';
+      case OEM_3:
+        return 'KeyboardCode.OEM_3';
+      case OEM_4:
+        return 'KeyboardCode.OEM_4';
+      case OEM_5:
+        return 'KeyboardCode.OEM_5';
+      case OEM_6:
+        return 'KeyboardCode.OEM_6';
+      case OEM_7:
+        return 'KeyboardCode.OEM_7';
+      case OEM_8:
+        return 'KeyboardCode.OEM_8';
+      case OEM_102:
+        return 'KeyboardCode.OEM_102';
+      case PROCESSKEY:
+        return 'KeyboardCode.PROCESSKEY';
+      case PACKET:
+        return 'KeyboardCode.PACKET';
+      case DBE_SBCSCHAR:
+        return 'KeyboardCode.DBE_SBCSCHAR';
+      case DBE_DBCSCHAR:
+        return 'KeyboardCode.DBE_DBCSCHAR';
+      case ATTN:
+        return 'KeyboardCode.ATTN';
+      case CRSEL:
+        return 'KeyboardCode.CRSEL';
+      case EXSEL:
+        return 'KeyboardCode.EXSEL';
+      case EREOF:
+        return 'KeyboardCode.EREOF';
+      case PLAY:
+        return 'KeyboardCode.PLAY';
+      case ZOOM:
+        return 'KeyboardCode.ZOOM';
+      case NONAME:
+        return 'KeyboardCode.NONAME';
+      case PA1:
+        return 'KeyboardCode.PA1';
+      case OEM_CLEAR:
+        return 'KeyboardCode.OEM_CLEAR';
+      case UNKNOWN:
+        return 'KeyboardCode.UNKNOWN';
+      case ALTGR:
+        return 'KeyboardCode.ALTGR';
+    }
+  }
+
+  int toJson() => value;
+}
+
+
+
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/location.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/location.mojom.dart
new file mode 100644
index 0000000..d67da00
--- /dev/null
+++ b/mojo/dart/packages/mojo_services/lib/mojo/location.mojom.dart
@@ -0,0 +1,188 @@
+// 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.
+
+library location_mojom;
+
+import 'dart:async';
+
+import 'package:mojo/bindings.dart' as bindings;
+import 'package:mojo/core.dart' as core;
+
+
+
+class Location extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(64, 0)
+  ];
+  int time = 0;
+  bool hasElapsedRealTimeNanos = false;
+  bool hasAltitude = false;
+  bool hasSpeed = false;
+  bool hasBearing = false;
+  bool hasAccuracy = false;
+  double speed = 0.0;
+  int elapsedRealTimeNanos = 0;
+  double latitude = 0.0;
+  double longitude = 0.0;
+  double altitude = 0.0;
+  double bearing = 0.0;
+  double accuracy = 0.0;
+
+  Location() : super(kVersions.last.size);
+
+  static Location deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static Location decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    Location result = new Location();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.time = decoder0.decodeUint64(8);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.hasElapsedRealTimeNanos = decoder0.decodeBool(16, 0);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.hasAltitude = decoder0.decodeBool(16, 1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.hasSpeed = decoder0.decodeBool(16, 2);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.hasBearing = decoder0.decodeBool(16, 3);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.hasAccuracy = decoder0.decodeBool(16, 4);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.speed = decoder0.decodeFloat(20);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.elapsedRealTimeNanos = decoder0.decodeUint64(24);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.latitude = decoder0.decodeDouble(32);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.longitude = decoder0.decodeDouble(40);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.altitude = decoder0.decodeDouble(48);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.bearing = decoder0.decodeFloat(56);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.accuracy = decoder0.decodeFloat(60);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeUint64(time, 8);
+    
+    encoder0.encodeBool(hasElapsedRealTimeNanos, 16, 0);
+    
+    encoder0.encodeBool(hasAltitude, 16, 1);
+    
+    encoder0.encodeBool(hasSpeed, 16, 2);
+    
+    encoder0.encodeBool(hasBearing, 16, 3);
+    
+    encoder0.encodeBool(hasAccuracy, 16, 4);
+    
+    encoder0.encodeFloat(speed, 20);
+    
+    encoder0.encodeUint64(elapsedRealTimeNanos, 24);
+    
+    encoder0.encodeDouble(latitude, 32);
+    
+    encoder0.encodeDouble(longitude, 40);
+    
+    encoder0.encodeDouble(altitude, 48);
+    
+    encoder0.encodeFloat(bearing, 56);
+    
+    encoder0.encodeFloat(accuracy, 60);
+  }
+
+  String toString() {
+    return "Location("
+           "time: $time" ", "
+           "hasElapsedRealTimeNanos: $hasElapsedRealTimeNanos" ", "
+           "hasAltitude: $hasAltitude" ", "
+           "hasSpeed: $hasSpeed" ", "
+           "hasBearing: $hasBearing" ", "
+           "hasAccuracy: $hasAccuracy" ", "
+           "speed: $speed" ", "
+           "elapsedRealTimeNanos: $elapsedRealTimeNanos" ", "
+           "latitude: $latitude" ", "
+           "longitude: $longitude" ", "
+           "altitude: $altitude" ", "
+           "bearing: $bearing" ", "
+           "accuracy: $accuracy" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["time"] = time;
+    map["hasElapsedRealTimeNanos"] = hasElapsedRealTimeNanos;
+    map["hasAltitude"] = hasAltitude;
+    map["hasSpeed"] = hasSpeed;
+    map["hasBearing"] = hasBearing;
+    map["hasAccuracy"] = hasAccuracy;
+    map["speed"] = speed;
+    map["elapsedRealTimeNanos"] = elapsedRealTimeNanos;
+    map["latitude"] = latitude;
+    map["longitude"] = longitude;
+    map["altitude"] = altitude;
+    map["bearing"] = bearing;
+    map["accuracy"] = accuracy;
+    return map;
+  }
+}
+
+
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
new file mode 100644
index 0000000..05b8b75
--- /dev/null
+++ b/mojo/dart/packages/mojo_services/lib/mojo/location_service.mojom.dart
@@ -0,0 +1,432 @@
+// 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.
+
+library location_service_mojom;
+
+import 'dart:async';
+
+import 'package:mojo/bindings.dart' as bindings;
+import 'package:mojo/core.dart' as core;
+import 'package:mojo_services/mojo/location.mojom.dart' as location_mojom;
+
+
+
+class LocationServiceGetNextLocationParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  LocationServiceUpdatePriority priority = null;
+
+  LocationServiceGetNextLocationParams() : super(kVersions.last.size);
+
+  static LocationServiceGetNextLocationParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static LocationServiceGetNextLocationParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    LocationServiceGetNextLocationParams result = new LocationServiceGetNextLocationParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+        result.priority = LocationServiceUpdatePriority.decode(decoder0, 8);
+        if (result.priority == null) {
+          throw new bindings.MojoCodecError(
+            'Trying to decode null union for non-nullable LocationServiceUpdatePriority.');
+        }
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeEnum(priority, 8);
+  }
+
+  String toString() {
+    return "LocationServiceGetNextLocationParams("
+           "priority: $priority" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["priority"] = priority;
+    return map;
+  }
+}
+
+
+class LocationServiceGetNextLocationResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  location_mojom.Location location = null;
+
+  LocationServiceGetNextLocationResponseParams() : super(kVersions.last.size);
+
+  static LocationServiceGetNextLocationResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static LocationServiceGetNextLocationResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    LocationServiceGetNextLocationResponseParams result = new LocationServiceGetNextLocationResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, true);
+      result.location = location_mojom.Location.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(location, 8, true);
+  }
+
+  String toString() {
+    return "LocationServiceGetNextLocationResponseParams("
+           "location: $location" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["location"] = location;
+    return map;
+  }
+}
+
+const int kLocationService_getNextLocation_name = 0;
+
+const String LocationServiceName =
+      'mojo::LocationService';
+  class LocationServiceUpdatePriority extends bindings.MojoEnum {
+  static const PRIORITY_BALANCED_POWER_ACCURACY = const LocationServiceUpdatePriority._(0);
+  static const PRIORITY_HIGH_ACCURACY = const LocationServiceUpdatePriority._(1);
+  static const PRIORITY_LOW_POWER = const LocationServiceUpdatePriority._(2);
+  static const PRIORITY_NO_POWER = const LocationServiceUpdatePriority._(3);
+
+  const LocationServiceUpdatePriority._(int v) : super(v);
+
+  static const Map<String, LocationServiceUpdatePriority> valuesMap = const {
+    "PRIORITY_BALANCED_POWER_ACCURACY": PRIORITY_BALANCED_POWER_ACCURACY,
+    "PRIORITY_HIGH_ACCURACY": PRIORITY_HIGH_ACCURACY,
+    "PRIORITY_LOW_POWER": PRIORITY_LOW_POWER,
+    "PRIORITY_NO_POWER": PRIORITY_NO_POWER,
+  };
+  static const List<LocationServiceUpdatePriority> values = const [
+    PRIORITY_BALANCED_POWER_ACCURACY,
+    PRIORITY_HIGH_ACCURACY,
+    PRIORITY_LOW_POWER,
+    PRIORITY_NO_POWER,
+  ];
+
+  static LocationServiceUpdatePriority valueOf(String name) => valuesMap[name];
+
+  factory LocationServiceUpdatePriority(int v) {
+    switch (v) {
+      case 0:
+        return PRIORITY_BALANCED_POWER_ACCURACY;
+      case 1:
+        return PRIORITY_HIGH_ACCURACY;
+      case 2:
+        return PRIORITY_LOW_POWER;
+      case 3:
+        return PRIORITY_NO_POWER;
+      default:
+        return null;
+    }
+  }
+
+  static LocationServiceUpdatePriority decode(bindings.Decoder decoder0, int offset) {
+    int v = decoder0.decodeUint32(offset);
+    LocationServiceUpdatePriority result = new LocationServiceUpdatePriority(v);
+    if (result == null) {
+      throw new bindings.MojoCodecError(
+          'Bad value $v for enum LocationServiceUpdatePriority.');
+    }
+    return result;
+  }
+
+  String toString() {
+    switch(this) {
+      case PRIORITY_BALANCED_POWER_ACCURACY:
+        return 'LocationServiceUpdatePriority.PRIORITY_BALANCED_POWER_ACCURACY';
+      case PRIORITY_HIGH_ACCURACY:
+        return 'LocationServiceUpdatePriority.PRIORITY_HIGH_ACCURACY';
+      case PRIORITY_LOW_POWER:
+        return 'LocationServiceUpdatePriority.PRIORITY_LOW_POWER';
+      case PRIORITY_NO_POWER:
+        return 'LocationServiceUpdatePriority.PRIORITY_NO_POWER';
+    }
+  }
+
+  int toJson() => value;
+}
+
+abstract class LocationService {
+  dynamic getNextLocation(LocationServiceUpdatePriority priority,[Function responseFactory = null]);
+
+}
+
+
+class LocationServiceProxyImpl extends bindings.Proxy {
+  LocationServiceProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  LocationServiceProxyImpl.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);
+  }
+
+  String get name => LocationServiceName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      case kLocationService_getNextLocation_name:
+        var r = LocationServiceGetNextLocationResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "LocationServiceProxyImpl($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,
+          kLocationService_getNextLocation_name,
+          -1,
+          bindings.MessageHeader.kMessageExpectsResponse);
+    }
+}
+
+
+class LocationServiceProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  LocationService ptr;
+  final String name = LocationServiceName;
+
+  LocationServiceProxy(LocationServiceProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _LocationServiceProxyCalls(proxyImpl);
+
+  LocationServiceProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new LocationServiceProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _LocationServiceProxyCalls(impl);
+  }
+
+  LocationServiceProxy.fromHandle(core.MojoHandle handle) :
+      impl = new LocationServiceProxyImpl.fromHandle(handle) {
+    ptr = new _LocationServiceProxyCalls(impl);
+  }
+
+  LocationServiceProxy.unbound() :
+      impl = new LocationServiceProxyImpl.unbound() {
+    ptr = new _LocationServiceProxyCalls(impl);
+  }
+
+  factory LocationServiceProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    LocationServiceProxy p = new LocationServiceProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static LocationServiceProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For LocationServiceProxy"));
+    return new LocationServiceProxy.fromEndpoint(endpoint);
+  }
+
+  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)";
+  }
+}
+
+
+class LocationServiceStub extends bindings.Stub {
+  LocationService _impl = null;
+
+  LocationServiceStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  LocationServiceStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  LocationServiceStub.unbound() : super.unbound();
+
+  static LocationServiceStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For LocationServiceStub"));
+    return new LocationServiceStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = LocationServiceName;
+
+
+  LocationServiceGetNextLocationResponseParams _LocationServiceGetNextLocationResponseParamsFactory(location_mojom.Location location) {
+    var result = new LocationServiceGetNextLocationResponseParams();
+    result.location = location;
+    return result;
+  }
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      case kLocationService_getNextLocation_name:
+        var params = LocationServiceGetNextLocationParams.deserialize(
+            message.payload);
+        var response = _impl.getNextLocation(params.priority,_LocationServiceGetNextLocationResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kLocationService_getNextLocation_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kLocationService_getNextLocation_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  LocationService get impl => _impl;
+  set impl(LocationService d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "LocationServiceStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/native_viewport.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/native_viewport.mojom.dart
new file mode 100644
index 0000000..69d6b76
--- /dev/null
+++ b/mojo/dart/packages/mojo_services/lib/mojo/native_viewport.mojom.dart
@@ -0,0 +1,1565 @@
+// 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.
+
+library native_viewport_mojom;
+
+import 'dart:async';
+
+import 'package:mojo/bindings.dart' as bindings;
+import 'package:mojo/core.dart' as core;
+import 'package:mojo_services/mojo/geometry.mojom.dart' as geometry_mojom;
+import 'package:mojo_services/mojo/context_provider.mojom.dart' as context_provider_mojom;
+import 'package:mojo_services/mojo/input_events.mojom.dart' as input_events_mojom;
+
+
+
+class ViewportMetrics extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  geometry_mojom.Size size = null;
+  double devicePixelRatio = 1.0;
+
+  ViewportMetrics() : super(kVersions.last.size);
+
+  static ViewportMetrics deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ViewportMetrics decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ViewportMetrics result = new ViewportMetrics();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, false);
+      result.size = geometry_mojom.Size.decode(decoder1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.devicePixelRatio = decoder0.decodeFloat(16);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(size, 8, false);
+    
+    encoder0.encodeFloat(devicePixelRatio, 16);
+  }
+
+  String toString() {
+    return "ViewportMetrics("
+           "size: $size" ", "
+           "devicePixelRatio: $devicePixelRatio" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["size"] = size;
+    map["devicePixelRatio"] = devicePixelRatio;
+    return map;
+  }
+}
+
+
+class SurfaceConfiguration extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  int redBits = 8;
+  int greenBits = 8;
+  int blueBits = 8;
+  int alphaBits = 8;
+  int depthBits = 0;
+  int stencilBits = 0;
+
+  SurfaceConfiguration() : super(kVersions.last.size);
+
+  static SurfaceConfiguration deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static SurfaceConfiguration decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    SurfaceConfiguration result = new SurfaceConfiguration();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.redBits = decoder0.decodeUint8(8);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.greenBits = decoder0.decodeUint8(9);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.blueBits = decoder0.decodeUint8(10);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.alphaBits = decoder0.decodeUint8(11);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.depthBits = decoder0.decodeUint8(12);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.stencilBits = decoder0.decodeUint8(13);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeUint8(redBits, 8);
+    
+    encoder0.encodeUint8(greenBits, 9);
+    
+    encoder0.encodeUint8(blueBits, 10);
+    
+    encoder0.encodeUint8(alphaBits, 11);
+    
+    encoder0.encodeUint8(depthBits, 12);
+    
+    encoder0.encodeUint8(stencilBits, 13);
+  }
+
+  String toString() {
+    return "SurfaceConfiguration("
+           "redBits: $redBits" ", "
+           "greenBits: $greenBits" ", "
+           "blueBits: $blueBits" ", "
+           "alphaBits: $alphaBits" ", "
+           "depthBits: $depthBits" ", "
+           "stencilBits: $stencilBits" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["redBits"] = redBits;
+    map["greenBits"] = greenBits;
+    map["blueBits"] = blueBits;
+    map["alphaBits"] = alphaBits;
+    map["depthBits"] = depthBits;
+    map["stencilBits"] = stencilBits;
+    return map;
+  }
+}
+
+
+class NativeViewportCreateParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  geometry_mojom.Size size = null;
+  SurfaceConfiguration requestedConfiguration = null;
+
+  NativeViewportCreateParams() : super(kVersions.last.size);
+
+  static NativeViewportCreateParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static NativeViewportCreateParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    NativeViewportCreateParams result = new NativeViewportCreateParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, false);
+      result.size = geometry_mojom.Size.decode(decoder1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(16, true);
+      result.requestedConfiguration = SurfaceConfiguration.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(size, 8, false);
+    
+    encoder0.encodeStruct(requestedConfiguration, 16, true);
+  }
+
+  String toString() {
+    return "NativeViewportCreateParams("
+           "size: $size" ", "
+           "requestedConfiguration: $requestedConfiguration" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["size"] = size;
+    map["requestedConfiguration"] = requestedConfiguration;
+    return map;
+  }
+}
+
+
+class NativeViewportCreateResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  ViewportMetrics metrics = null;
+
+  NativeViewportCreateResponseParams() : super(kVersions.last.size);
+
+  static NativeViewportCreateResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static NativeViewportCreateResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    NativeViewportCreateResponseParams result = new NativeViewportCreateResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, false);
+      result.metrics = ViewportMetrics.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(metrics, 8, false);
+  }
+
+  String toString() {
+    return "NativeViewportCreateResponseParams("
+           "metrics: $metrics" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["metrics"] = metrics;
+    return map;
+  }
+}
+
+
+class NativeViewportShowParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(8, 0)
+  ];
+
+  NativeViewportShowParams() : super(kVersions.last.size);
+
+  static NativeViewportShowParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static NativeViewportShowParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    NativeViewportShowParams result = new NativeViewportShowParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    encoder.getStructEncoderAtOffset(kVersions.last);
+  }
+
+  String toString() {
+    return "NativeViewportShowParams("")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    return map;
+  }
+}
+
+
+class NativeViewportHideParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(8, 0)
+  ];
+
+  NativeViewportHideParams() : super(kVersions.last.size);
+
+  static NativeViewportHideParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static NativeViewportHideParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    NativeViewportHideParams result = new NativeViewportHideParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    encoder.getStructEncoderAtOffset(kVersions.last);
+  }
+
+  String toString() {
+    return "NativeViewportHideParams("")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    return map;
+  }
+}
+
+
+class NativeViewportCloseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(8, 0)
+  ];
+
+  NativeViewportCloseParams() : super(kVersions.last.size);
+
+  static NativeViewportCloseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static NativeViewportCloseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    NativeViewportCloseParams result = new NativeViewportCloseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    encoder.getStructEncoderAtOffset(kVersions.last);
+  }
+
+  String toString() {
+    return "NativeViewportCloseParams("")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    return map;
+  }
+}
+
+
+class NativeViewportSetSizeParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  geometry_mojom.Size size = null;
+
+  NativeViewportSetSizeParams() : super(kVersions.last.size);
+
+  static NativeViewportSetSizeParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static NativeViewportSetSizeParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    NativeViewportSetSizeParams result = new NativeViewportSetSizeParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, false);
+      result.size = geometry_mojom.Size.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(size, 8, false);
+  }
+
+  String toString() {
+    return "NativeViewportSetSizeParams("
+           "size: $size" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["size"] = size;
+    return map;
+  }
+}
+
+
+class NativeViewportSetEventDispatcherParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  Object dispatcher = null;
+
+  NativeViewportSetEventDispatcherParams() : super(kVersions.last.size);
+
+  static NativeViewportSetEventDispatcherParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static NativeViewportSetEventDispatcherParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    NativeViewportSetEventDispatcherParams result = new NativeViewportSetEventDispatcherParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.dispatcher = decoder0.decodeServiceInterface(8, false, NativeViewportEventDispatcherProxy.newFromEndpoint);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeInterface(dispatcher, 8, false);
+  }
+
+  String toString() {
+    return "NativeViewportSetEventDispatcherParams("
+           "dispatcher: $dispatcher" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+
+class NativeViewportGetContextProviderParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  Object provider = null;
+
+  NativeViewportGetContextProviderParams() : super(kVersions.last.size);
+
+  static NativeViewportGetContextProviderParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static NativeViewportGetContextProviderParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    NativeViewportGetContextProviderParams result = new NativeViewportGetContextProviderParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.provider = decoder0.decodeInterfaceRequest(8, false, context_provider_mojom.ContextProviderStub.newFromEndpoint);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeInterfaceRequest(provider, 8, false);
+  }
+
+  String toString() {
+    return "NativeViewportGetContextProviderParams("
+           "provider: $provider" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+
+class NativeViewportRequestMetricsParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(8, 0)
+  ];
+
+  NativeViewportRequestMetricsParams() : super(kVersions.last.size);
+
+  static NativeViewportRequestMetricsParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static NativeViewportRequestMetricsParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    NativeViewportRequestMetricsParams result = new NativeViewportRequestMetricsParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    encoder.getStructEncoderAtOffset(kVersions.last);
+  }
+
+  String toString() {
+    return "NativeViewportRequestMetricsParams("")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    return map;
+  }
+}
+
+
+class NativeViewportRequestMetricsResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  ViewportMetrics metrics = null;
+
+  NativeViewportRequestMetricsResponseParams() : super(kVersions.last.size);
+
+  static NativeViewportRequestMetricsResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static NativeViewportRequestMetricsResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    NativeViewportRequestMetricsResponseParams result = new NativeViewportRequestMetricsResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, false);
+      result.metrics = ViewportMetrics.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(metrics, 8, false);
+  }
+
+  String toString() {
+    return "NativeViewportRequestMetricsResponseParams("
+           "metrics: $metrics" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["metrics"] = metrics;
+    return map;
+  }
+}
+
+
+class NativeViewportEventDispatcherOnEventParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  input_events_mojom.Event event = null;
+
+  NativeViewportEventDispatcherOnEventParams() : super(kVersions.last.size);
+
+  static NativeViewportEventDispatcherOnEventParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static NativeViewportEventDispatcherOnEventParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    NativeViewportEventDispatcherOnEventParams result = new NativeViewportEventDispatcherOnEventParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, false);
+      result.event = input_events_mojom.Event.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(event, 8, false);
+  }
+
+  String toString() {
+    return "NativeViewportEventDispatcherOnEventParams("
+           "event: $event" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["event"] = event;
+    return map;
+  }
+}
+
+
+class NativeViewportEventDispatcherOnEventResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(8, 0)
+  ];
+
+  NativeViewportEventDispatcherOnEventResponseParams() : super(kVersions.last.size);
+
+  static NativeViewportEventDispatcherOnEventResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static NativeViewportEventDispatcherOnEventResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    NativeViewportEventDispatcherOnEventResponseParams result = new NativeViewportEventDispatcherOnEventResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    encoder.getStructEncoderAtOffset(kVersions.last);
+  }
+
+  String toString() {
+    return "NativeViewportEventDispatcherOnEventResponseParams("")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    return map;
+  }
+}
+
+const int kNativeViewport_create_name = 0;
+const int kNativeViewport_show_name = 1;
+const int kNativeViewport_hide_name = 2;
+const int kNativeViewport_close_name = 3;
+const int kNativeViewport_setSize_name = 4;
+const int kNativeViewport_setEventDispatcher_name = 5;
+const int kNativeViewport_getContextProvider_name = 6;
+const int kNativeViewport_requestMetrics_name = 7;
+
+const String NativeViewportName =
+      'mojo::NativeViewport';
+
+abstract class NativeViewport {
+  dynamic create(geometry_mojom.Size size,SurfaceConfiguration requestedConfiguration,[Function responseFactory = null]);
+  void show();
+  void hide();
+  void close();
+  void setSize(geometry_mojom.Size size);
+  void setEventDispatcher(Object dispatcher);
+  void getContextProvider(Object provider);
+  dynamic requestMetrics([Function responseFactory = null]);
+
+}
+
+
+class NativeViewportProxyImpl extends bindings.Proxy {
+  NativeViewportProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  NativeViewportProxyImpl.fromHandle(core.MojoHandle handle) :
+      super.fromHandle(handle);
+
+  NativeViewportProxyImpl.unbound() : super.unbound();
+
+  static NativeViewportProxyImpl newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For NativeViewportProxyImpl"));
+    return new NativeViewportProxyImpl.fromEndpoint(endpoint);
+  }
+
+  String get name => NativeViewportName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      case kNativeViewport_create_name:
+        var r = NativeViewportCreateResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      case kNativeViewport_requestMetrics_name:
+        var r = NativeViewportRequestMetricsResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "NativeViewportProxyImpl($superString)";
+  }
+}
+
+
+class _NativeViewportProxyCalls implements NativeViewport {
+  NativeViewportProxyImpl _proxyImpl;
+
+  _NativeViewportProxyCalls(this._proxyImpl);
+    dynamic create(geometry_mojom.Size size,SurfaceConfiguration requestedConfiguration,[Function responseFactory = null]) {
+      var params = new NativeViewportCreateParams();
+      params.size = size;
+      params.requestedConfiguration = requestedConfiguration;
+      return _proxyImpl.sendMessageWithRequestId(
+          params,
+          kNativeViewport_create_name,
+          -1,
+          bindings.MessageHeader.kMessageExpectsResponse);
+    }
+    void show() {
+      if (!_proxyImpl.isBound) {
+        _proxyImpl.proxyError("The Proxy is closed.");
+        return;
+      }
+      var params = new NativeViewportShowParams();
+      _proxyImpl.sendMessage(params, kNativeViewport_show_name);
+    }
+  
+    void hide() {
+      if (!_proxyImpl.isBound) {
+        _proxyImpl.proxyError("The Proxy is closed.");
+        return;
+      }
+      var params = new NativeViewportHideParams();
+      _proxyImpl.sendMessage(params, kNativeViewport_hide_name);
+    }
+  
+    void close() {
+      if (!_proxyImpl.isBound) {
+        _proxyImpl.proxyError("The Proxy is closed.");
+        return;
+      }
+      var params = new NativeViewportCloseParams();
+      _proxyImpl.sendMessage(params, kNativeViewport_close_name);
+    }
+  
+    void setSize(geometry_mojom.Size size) {
+      if (!_proxyImpl.isBound) {
+        _proxyImpl.proxyError("The Proxy is closed.");
+        return;
+      }
+      var params = new NativeViewportSetSizeParams();
+      params.size = size;
+      _proxyImpl.sendMessage(params, kNativeViewport_setSize_name);
+    }
+  
+    void setEventDispatcher(Object dispatcher) {
+      if (!_proxyImpl.isBound) {
+        _proxyImpl.proxyError("The Proxy is closed.");
+        return;
+      }
+      var params = new NativeViewportSetEventDispatcherParams();
+      params.dispatcher = dispatcher;
+      _proxyImpl.sendMessage(params, kNativeViewport_setEventDispatcher_name);
+    }
+  
+    void getContextProvider(Object provider) {
+      if (!_proxyImpl.isBound) {
+        _proxyImpl.proxyError("The Proxy is closed.");
+        return;
+      }
+      var params = new NativeViewportGetContextProviderParams();
+      params.provider = provider;
+      _proxyImpl.sendMessage(params, kNativeViewport_getContextProvider_name);
+    }
+  
+    dynamic requestMetrics([Function responseFactory = null]) {
+      var params = new NativeViewportRequestMetricsParams();
+      return _proxyImpl.sendMessageWithRequestId(
+          params,
+          kNativeViewport_requestMetrics_name,
+          -1,
+          bindings.MessageHeader.kMessageExpectsResponse);
+    }
+}
+
+
+class NativeViewportProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  NativeViewport ptr;
+  final String name = NativeViewportName;
+
+  NativeViewportProxy(NativeViewportProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _NativeViewportProxyCalls(proxyImpl);
+
+  NativeViewportProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new NativeViewportProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _NativeViewportProxyCalls(impl);
+  }
+
+  NativeViewportProxy.fromHandle(core.MojoHandle handle) :
+      impl = new NativeViewportProxyImpl.fromHandle(handle) {
+    ptr = new _NativeViewportProxyCalls(impl);
+  }
+
+  NativeViewportProxy.unbound() :
+      impl = new NativeViewportProxyImpl.unbound() {
+    ptr = new _NativeViewportProxyCalls(impl);
+  }
+
+  factory NativeViewportProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    NativeViewportProxy p = new NativeViewportProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static NativeViewportProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For NativeViewportProxy"));
+    return new NativeViewportProxy.fromEndpoint(endpoint);
+  }
+
+  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 "NativeViewportProxy($impl)";
+  }
+}
+
+
+class NativeViewportStub extends bindings.Stub {
+  NativeViewport _impl = null;
+
+  NativeViewportStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  NativeViewportStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  NativeViewportStub.unbound() : super.unbound();
+
+  static NativeViewportStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For NativeViewportStub"));
+    return new NativeViewportStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = NativeViewportName;
+
+
+  NativeViewportCreateResponseParams _NativeViewportCreateResponseParamsFactory(ViewportMetrics metrics) {
+    var result = new NativeViewportCreateResponseParams();
+    result.metrics = metrics;
+    return result;
+  }
+  NativeViewportRequestMetricsResponseParams _NativeViewportRequestMetricsResponseParamsFactory(ViewportMetrics metrics) {
+    var result = new NativeViewportRequestMetricsResponseParams();
+    result.metrics = metrics;
+    return result;
+  }
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      case kNativeViewport_create_name:
+        var params = NativeViewportCreateParams.deserialize(
+            message.payload);
+        var response = _impl.create(params.size,params.requestedConfiguration,_NativeViewportCreateResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kNativeViewport_create_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kNativeViewport_create_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      case kNativeViewport_show_name:
+        var params = NativeViewportShowParams.deserialize(
+            message.payload);
+        _impl.show();
+        break;
+      case kNativeViewport_hide_name:
+        var params = NativeViewportHideParams.deserialize(
+            message.payload);
+        _impl.hide();
+        break;
+      case kNativeViewport_close_name:
+        var params = NativeViewportCloseParams.deserialize(
+            message.payload);
+        _impl.close();
+        break;
+      case kNativeViewport_setSize_name:
+        var params = NativeViewportSetSizeParams.deserialize(
+            message.payload);
+        _impl.setSize(params.size);
+        break;
+      case kNativeViewport_setEventDispatcher_name:
+        var params = NativeViewportSetEventDispatcherParams.deserialize(
+            message.payload);
+        _impl.setEventDispatcher(params.dispatcher);
+        break;
+      case kNativeViewport_getContextProvider_name:
+        var params = NativeViewportGetContextProviderParams.deserialize(
+            message.payload);
+        _impl.getContextProvider(params.provider);
+        break;
+      case kNativeViewport_requestMetrics_name:
+        var params = NativeViewportRequestMetricsParams.deserialize(
+            message.payload);
+        var response = _impl.requestMetrics(_NativeViewportRequestMetricsResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kNativeViewport_requestMetrics_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kNativeViewport_requestMetrics_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  NativeViewport get impl => _impl;
+  set impl(NativeViewport d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "NativeViewportStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+const int kNativeViewportEventDispatcher_onEvent_name = 0;
+
+const String NativeViewportEventDispatcherName =
+      'mojo::NativeViewportEventDispatcher';
+
+abstract class NativeViewportEventDispatcher {
+  dynamic onEvent(input_events_mojom.Event event,[Function responseFactory = null]);
+
+}
+
+
+class NativeViewportEventDispatcherProxyImpl extends bindings.Proxy {
+  NativeViewportEventDispatcherProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  NativeViewportEventDispatcherProxyImpl.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);
+  }
+
+  String get name => NativeViewportEventDispatcherName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      case kNativeViewportEventDispatcher_onEvent_name:
+        var r = NativeViewportEventDispatcherOnEventResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "NativeViewportEventDispatcherProxyImpl($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,
+          kNativeViewportEventDispatcher_onEvent_name,
+          -1,
+          bindings.MessageHeader.kMessageExpectsResponse);
+    }
+}
+
+
+class NativeViewportEventDispatcherProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  NativeViewportEventDispatcher ptr;
+  final String name = NativeViewportEventDispatcherName;
+
+  NativeViewportEventDispatcherProxy(NativeViewportEventDispatcherProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _NativeViewportEventDispatcherProxyCalls(proxyImpl);
+
+  NativeViewportEventDispatcherProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new NativeViewportEventDispatcherProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _NativeViewportEventDispatcherProxyCalls(impl);
+  }
+
+  NativeViewportEventDispatcherProxy.fromHandle(core.MojoHandle handle) :
+      impl = new NativeViewportEventDispatcherProxyImpl.fromHandle(handle) {
+    ptr = new _NativeViewportEventDispatcherProxyCalls(impl);
+  }
+
+  NativeViewportEventDispatcherProxy.unbound() :
+      impl = new NativeViewportEventDispatcherProxyImpl.unbound() {
+    ptr = new _NativeViewportEventDispatcherProxyCalls(impl);
+  }
+
+  factory NativeViewportEventDispatcherProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    NativeViewportEventDispatcherProxy p = new NativeViewportEventDispatcherProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static NativeViewportEventDispatcherProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For NativeViewportEventDispatcherProxy"));
+    return new NativeViewportEventDispatcherProxy.fromEndpoint(endpoint);
+  }
+
+  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)";
+  }
+}
+
+
+class NativeViewportEventDispatcherStub extends bindings.Stub {
+  NativeViewportEventDispatcher _impl = null;
+
+  NativeViewportEventDispatcherStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  NativeViewportEventDispatcherStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  NativeViewportEventDispatcherStub.unbound() : super.unbound();
+
+  static NativeViewportEventDispatcherStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For NativeViewportEventDispatcherStub"));
+    return new NativeViewportEventDispatcherStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = NativeViewportEventDispatcherName;
+
+
+  NativeViewportEventDispatcherOnEventResponseParams _NativeViewportEventDispatcherOnEventResponseParamsFactory() {
+    var result = new NativeViewportEventDispatcherOnEventResponseParams();
+    return result;
+  }
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      case kNativeViewportEventDispatcher_onEvent_name:
+        var params = NativeViewportEventDispatcherOnEventParams.deserialize(
+            message.payload);
+        var response = _impl.onEvent(params.event,_NativeViewportEventDispatcherOnEventResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kNativeViewportEventDispatcher_onEvent_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kNativeViewportEventDispatcher_onEvent_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  NativeViewportEventDispatcher get impl => _impl;
+  set impl(NativeViewportEventDispatcher d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "NativeViewportEventDispatcherStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/navigation.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/navigation.mojom.dart
new file mode 100644
index 0000000..4968d4c
--- /dev/null
+++ b/mojo/dart/packages/mojo_services/lib/mojo/navigation.mojom.dart
@@ -0,0 +1,493 @@
+// 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.
+
+library navigation_mojom;
+
+import 'dart:async';
+
+import 'package:mojo/bindings.dart' as bindings;
+import 'package:mojo/core.dart' as core;
+import 'package:mojo/mojo/url_request.mojom.dart' as url_request_mojom;
+class Target extends bindings.MojoEnum {
+  static const DEFAULT = const Target._(0);
+  static const SOURCE_NODE = const Target._(1);
+  static const NEW_NODE = const Target._(2);
+
+  const Target._(int v) : super(v);
+
+  static const Map<String, Target> valuesMap = const {
+    "DEFAULT": DEFAULT,
+    "SOURCE_NODE": SOURCE_NODE,
+    "NEW_NODE": NEW_NODE,
+  };
+  static const List<Target> values = const [
+    DEFAULT,
+    SOURCE_NODE,
+    NEW_NODE,
+  ];
+
+  static Target valueOf(String name) => valuesMap[name];
+
+  factory Target(int v) {
+    switch (v) {
+      case 0:
+        return DEFAULT;
+      case 1:
+        return SOURCE_NODE;
+      case 2:
+        return NEW_NODE;
+      default:
+        return null;
+    }
+  }
+
+  static Target decode(bindings.Decoder decoder0, int offset) {
+    int v = decoder0.decodeUint32(offset);
+    Target result = new Target(v);
+    if (result == null) {
+      throw new bindings.MojoCodecError(
+          'Bad value $v for enum Target.');
+    }
+    return result;
+  }
+
+  String toString() {
+    switch(this) {
+      case DEFAULT:
+        return 'Target.DEFAULT';
+      case SOURCE_NODE:
+        return 'Target.SOURCE_NODE';
+      case NEW_NODE:
+        return 'Target.NEW_NODE';
+    }
+  }
+
+  int toJson() => value;
+}
+
+
+
+class NavigatorHostRequestNavigateParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  Target target = null;
+  url_request_mojom.UrlRequest request = null;
+
+  NavigatorHostRequestNavigateParams() : super(kVersions.last.size);
+
+  static NavigatorHostRequestNavigateParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static NavigatorHostRequestNavigateParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    NavigatorHostRequestNavigateParams result = new NavigatorHostRequestNavigateParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+        result.target = Target.decode(decoder0, 8);
+        if (result.target == null) {
+          throw new bindings.MojoCodecError(
+            'Trying to decode null union for non-nullable Target.');
+        }
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(16, false);
+      result.request = url_request_mojom.UrlRequest.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeEnum(target, 8);
+    
+    encoder0.encodeStruct(request, 16, false);
+  }
+
+  String toString() {
+    return "NavigatorHostRequestNavigateParams("
+           "target: $target" ", "
+           "request: $request" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+
+class NavigatorHostRequestNavigateHistoryParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  int delta = 0;
+
+  NavigatorHostRequestNavigateHistoryParams() : super(kVersions.last.size);
+
+  static NavigatorHostRequestNavigateHistoryParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static NavigatorHostRequestNavigateHistoryParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    NavigatorHostRequestNavigateHistoryParams result = new NavigatorHostRequestNavigateHistoryParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.delta = decoder0.decodeInt32(8);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeInt32(delta, 8);
+  }
+
+  String toString() {
+    return "NavigatorHostRequestNavigateHistoryParams("
+           "delta: $delta" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["delta"] = delta;
+    return map;
+  }
+}
+
+
+class NavigatorHostDidNavigateLocallyParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  String url = null;
+
+  NavigatorHostDidNavigateLocallyParams() : super(kVersions.last.size);
+
+  static NavigatorHostDidNavigateLocallyParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static NavigatorHostDidNavigateLocallyParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    NavigatorHostDidNavigateLocallyParams result = new NavigatorHostDidNavigateLocallyParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.url = decoder0.decodeString(8, false);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeString(url, 8, false);
+  }
+
+  String toString() {
+    return "NavigatorHostDidNavigateLocallyParams("
+           "url: $url" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["url"] = url;
+    return map;
+  }
+}
+
+const int kNavigatorHost_requestNavigate_name = 0;
+const int kNavigatorHost_requestNavigateHistory_name = 1;
+const int kNavigatorHost_didNavigateLocally_name = 2;
+
+const String NavigatorHostName =
+      'mojo::NavigatorHost';
+
+abstract class NavigatorHost {
+  void requestNavigate(Target target, url_request_mojom.UrlRequest request);
+  void requestNavigateHistory(int delta);
+  void didNavigateLocally(String url);
+
+}
+
+
+class NavigatorHostProxyImpl extends bindings.Proxy {
+  NavigatorHostProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  NavigatorHostProxyImpl.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);
+  }
+
+  String get name => NavigatorHostName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "NavigatorHostProxyImpl($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, kNavigatorHost_requestNavigate_name);
+    }
+  
+    void requestNavigateHistory(int delta) {
+      if (!_proxyImpl.isBound) {
+        _proxyImpl.proxyError("The Proxy is closed.");
+        return;
+      }
+      var params = new NavigatorHostRequestNavigateHistoryParams();
+      params.delta = delta;
+      _proxyImpl.sendMessage(params, kNavigatorHost_requestNavigateHistory_name);
+    }
+  
+    void didNavigateLocally(String url) {
+      if (!_proxyImpl.isBound) {
+        _proxyImpl.proxyError("The Proxy is closed.");
+        return;
+      }
+      var params = new NavigatorHostDidNavigateLocallyParams();
+      params.url = url;
+      _proxyImpl.sendMessage(params, kNavigatorHost_didNavigateLocally_name);
+    }
+  
+}
+
+
+class NavigatorHostProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  NavigatorHost ptr;
+  final String name = NavigatorHostName;
+
+  NavigatorHostProxy(NavigatorHostProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _NavigatorHostProxyCalls(proxyImpl);
+
+  NavigatorHostProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new NavigatorHostProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _NavigatorHostProxyCalls(impl);
+  }
+
+  NavigatorHostProxy.fromHandle(core.MojoHandle handle) :
+      impl = new NavigatorHostProxyImpl.fromHandle(handle) {
+    ptr = new _NavigatorHostProxyCalls(impl);
+  }
+
+  NavigatorHostProxy.unbound() :
+      impl = new NavigatorHostProxyImpl.unbound() {
+    ptr = new _NavigatorHostProxyCalls(impl);
+  }
+
+  factory NavigatorHostProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    NavigatorHostProxy p = new NavigatorHostProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static NavigatorHostProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For NavigatorHostProxy"));
+    return new NavigatorHostProxy.fromEndpoint(endpoint);
+  }
+
+  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 "NavigatorHostProxy($impl)";
+  }
+}
+
+
+class NavigatorHostStub extends bindings.Stub {
+  NavigatorHost _impl = null;
+
+  NavigatorHostStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  NavigatorHostStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  NavigatorHostStub.unbound() : super.unbound();
+
+  static NavigatorHostStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For NavigatorHostStub"));
+    return new NavigatorHostStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = NavigatorHostName;
+
+
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      case kNavigatorHost_requestNavigate_name:
+        var params = NavigatorHostRequestNavigateParams.deserialize(
+            message.payload);
+        _impl.requestNavigate(params.target, params.request);
+        break;
+      case kNavigatorHost_requestNavigateHistory_name:
+        var params = NavigatorHostRequestNavigateHistoryParams.deserialize(
+            message.payload);
+        _impl.requestNavigateHistory(params.delta);
+        break;
+      case kNavigatorHost_didNavigateLocally_name:
+        var params = NavigatorHostDidNavigateLocallyParams.deserialize(
+            message.payload);
+        _impl.didNavigateLocally(params.url);
+        break;
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  NavigatorHost get impl => _impl;
+  set impl(NavigatorHost d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "NavigatorHostStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/net_address.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/net_address.mojom.dart
new file mode 100644
index 0000000..ab3ebb3
--- /dev/null
+++ b/mojo/dart/packages/mojo_services/lib/mojo/net_address.mojom.dart
@@ -0,0 +1,312 @@
+// 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.
+
+library net_address_mojom;
+
+import 'dart:async';
+
+import 'package:mojo/bindings.dart' as bindings;
+import 'package:mojo/core.dart' as core;
+class NetAddressFamily extends bindings.MojoEnum {
+  static const UNSPECIFIED = const NetAddressFamily._(0);
+  static const IPV4 = const NetAddressFamily._(1);
+  static const IPV6 = const NetAddressFamily._(2);
+
+  const NetAddressFamily._(int v) : super(v);
+
+  static const Map<String, NetAddressFamily> valuesMap = const {
+    "UNSPECIFIED": UNSPECIFIED,
+    "IPV4": IPV4,
+    "IPV6": IPV6,
+  };
+  static const List<NetAddressFamily> values = const [
+    UNSPECIFIED,
+    IPV4,
+    IPV6,
+  ];
+
+  static NetAddressFamily valueOf(String name) => valuesMap[name];
+
+  factory NetAddressFamily(int v) {
+    switch (v) {
+      case 0:
+        return UNSPECIFIED;
+      case 1:
+        return IPV4;
+      case 2:
+        return IPV6;
+      default:
+        return null;
+    }
+  }
+
+  static NetAddressFamily decode(bindings.Decoder decoder0, int offset) {
+    int v = decoder0.decodeUint32(offset);
+    NetAddressFamily result = new NetAddressFamily(v);
+    if (result == null) {
+      throw new bindings.MojoCodecError(
+          'Bad value $v for enum NetAddressFamily.');
+    }
+    return result;
+  }
+
+  String toString() {
+    switch(this) {
+      case UNSPECIFIED:
+        return 'NetAddressFamily.UNSPECIFIED';
+      case IPV4:
+        return 'NetAddressFamily.IPV4';
+      case IPV6:
+        return 'NetAddressFamily.IPV6';
+    }
+  }
+
+  int toJson() => value;
+}
+
+
+
+class NetAddressIPv4 extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  int port = 0;
+  List<int> addr = null;
+
+  NetAddressIPv4() : super(kVersions.last.size);
+
+  static NetAddressIPv4 deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static NetAddressIPv4 decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    NetAddressIPv4 result = new NetAddressIPv4();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.port = decoder0.decodeUint16(8);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.addr = decoder0.decodeUint8Array(16, bindings.kNothingNullable, 4);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeUint16(port, 8);
+    
+    encoder0.encodeUint8Array(addr, 16, bindings.kNothingNullable, 4);
+  }
+
+  String toString() {
+    return "NetAddressIPv4("
+           "port: $port" ", "
+           "addr: $addr" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["port"] = port;
+    map["addr"] = addr;
+    return map;
+  }
+}
+
+
+class NetAddressIPv6 extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  int port = 0;
+  List<int> addr = null;
+
+  NetAddressIPv6() : super(kVersions.last.size);
+
+  static NetAddressIPv6 deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static NetAddressIPv6 decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    NetAddressIPv6 result = new NetAddressIPv6();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.port = decoder0.decodeUint16(8);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.addr = decoder0.decodeUint8Array(16, bindings.kNothingNullable, 16);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeUint16(port, 8);
+    
+    encoder0.encodeUint8Array(addr, 16, bindings.kNothingNullable, 16);
+  }
+
+  String toString() {
+    return "NetAddressIPv6("
+           "port: $port" ", "
+           "addr: $addr" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["port"] = port;
+    map["addr"] = addr;
+    return map;
+  }
+}
+
+
+class NetAddress extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(32, 0)
+  ];
+  NetAddressFamily family = new NetAddressFamily(0);
+  NetAddressIPv4 ipv4 = null;
+  NetAddressIPv6 ipv6 = null;
+
+  NetAddress() : super(kVersions.last.size);
+
+  static NetAddress deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static NetAddress decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    NetAddress result = new NetAddress();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+        result.family = NetAddressFamily.decode(decoder0, 8);
+        if (result.family == null) {
+          throw new bindings.MojoCodecError(
+            'Trying to decode null union for non-nullable NetAddressFamily.');
+        }
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(16, true);
+      result.ipv4 = NetAddressIPv4.decode(decoder1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(24, true);
+      result.ipv6 = NetAddressIPv6.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeEnum(family, 8);
+    
+    encoder0.encodeStruct(ipv4, 16, true);
+    
+    encoder0.encodeStruct(ipv6, 24, true);
+  }
+
+  String toString() {
+    return "NetAddress("
+           "family: $family" ", "
+           "ipv4: $ipv4" ", "
+           "ipv6: $ipv6" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["family"] = family;
+    map["ipv4"] = ipv4;
+    map["ipv6"] = ipv6;
+    return map;
+  }
+}
+
+
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
new file mode 100644
index 0000000..8a811ff
--- /dev/null
+++ b/mojo/dart/packages/mojo_services/lib/mojo/network_service.mojom.dart
@@ -0,0 +1,1337 @@
+// 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.
+
+library network_service_mojom;
+
+import 'dart:async';
+
+import 'package:mojo/bindings.dart' as bindings;
+import 'package:mojo/core.dart' as core;
+import 'package:mojo/mojo/network_error.mojom.dart' as network_error_mojom;
+import 'package:mojo_services/mojo/cookie_store.mojom.dart' as cookie_store_mojom;
+import 'package:mojo_services/mojo/host_resolver.mojom.dart' as host_resolver_mojom;
+import 'package:mojo_services/mojo/http_server.mojom.dart' as http_server_mojom;
+import 'package:mojo_services/mojo/net_address.mojom.dart' as net_address_mojom;
+import 'package:mojo_services/mojo/tcp_bound_socket.mojom.dart' as tcp_bound_socket_mojom;
+import 'package:mojo_services/mojo/tcp_connected_socket.mojom.dart' as tcp_connected_socket_mojom;
+import 'package:mojo_services/mojo/udp_socket.mojom.dart' as udp_socket_mojom;
+import 'package:mojo_services/mojo/url_loader.mojom.dart' as url_loader_mojom;
+import 'package:mojo_services/mojo/url_loader_interceptor.mojom.dart' as url_loader_interceptor_mojom;
+import 'package:mojo_services/mojo/web_socket.mojom.dart' as web_socket_mojom;
+
+
+
+class NetworkServiceCreateUrlLoaderParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  Object loader = null;
+
+  NetworkServiceCreateUrlLoaderParams() : super(kVersions.last.size);
+
+  static NetworkServiceCreateUrlLoaderParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static NetworkServiceCreateUrlLoaderParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    NetworkServiceCreateUrlLoaderParams result = new NetworkServiceCreateUrlLoaderParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.loader = decoder0.decodeInterfaceRequest(8, false, url_loader_mojom.UrlLoaderStub.newFromEndpoint);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeInterfaceRequest(loader, 8, false);
+  }
+
+  String toString() {
+    return "NetworkServiceCreateUrlLoaderParams("
+           "loader: $loader" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+
+class NetworkServiceGetCookieStoreParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  Object cookieStore = null;
+
+  NetworkServiceGetCookieStoreParams() : super(kVersions.last.size);
+
+  static NetworkServiceGetCookieStoreParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static NetworkServiceGetCookieStoreParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    NetworkServiceGetCookieStoreParams result = new NetworkServiceGetCookieStoreParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.cookieStore = decoder0.decodeInterfaceRequest(8, false, cookie_store_mojom.CookieStoreStub.newFromEndpoint);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeInterfaceRequest(cookieStore, 8, false);
+  }
+
+  String toString() {
+    return "NetworkServiceGetCookieStoreParams("
+           "cookieStore: $cookieStore" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+
+class NetworkServiceCreateWebSocketParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  Object socket = null;
+
+  NetworkServiceCreateWebSocketParams() : super(kVersions.last.size);
+
+  static NetworkServiceCreateWebSocketParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static NetworkServiceCreateWebSocketParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    NetworkServiceCreateWebSocketParams result = new NetworkServiceCreateWebSocketParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.socket = decoder0.decodeInterfaceRequest(8, false, web_socket_mojom.WebSocketStub.newFromEndpoint);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeInterfaceRequest(socket, 8, false);
+  }
+
+  String toString() {
+    return "NetworkServiceCreateWebSocketParams("
+           "socket: $socket" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+
+class NetworkServiceCreateTcpBoundSocketParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  net_address_mojom.NetAddress localAddress = null;
+  Object boundSocket = null;
+
+  NetworkServiceCreateTcpBoundSocketParams() : super(kVersions.last.size);
+
+  static NetworkServiceCreateTcpBoundSocketParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static NetworkServiceCreateTcpBoundSocketParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    NetworkServiceCreateTcpBoundSocketParams result = new NetworkServiceCreateTcpBoundSocketParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, true);
+      result.localAddress = net_address_mojom.NetAddress.decode(decoder1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.boundSocket = decoder0.decodeInterfaceRequest(16, false, tcp_bound_socket_mojom.TcpBoundSocketStub.newFromEndpoint);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(localAddress, 8, true);
+    
+    encoder0.encodeInterfaceRequest(boundSocket, 16, false);
+  }
+
+  String toString() {
+    return "NetworkServiceCreateTcpBoundSocketParams("
+           "localAddress: $localAddress" ", "
+           "boundSocket: $boundSocket" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+
+class NetworkServiceCreateTcpBoundSocketResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  network_error_mojom.NetworkError result = null;
+  net_address_mojom.NetAddress boundTo = null;
+
+  NetworkServiceCreateTcpBoundSocketResponseParams() : super(kVersions.last.size);
+
+  static NetworkServiceCreateTcpBoundSocketResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static NetworkServiceCreateTcpBoundSocketResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    NetworkServiceCreateTcpBoundSocketResponseParams result = new NetworkServiceCreateTcpBoundSocketResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, false);
+      result.result = network_error_mojom.NetworkError.decode(decoder1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(16, true);
+      result.boundTo = net_address_mojom.NetAddress.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(result, 8, false);
+    
+    encoder0.encodeStruct(boundTo, 16, true);
+  }
+
+  String toString() {
+    return "NetworkServiceCreateTcpBoundSocketResponseParams("
+           "result: $result" ", "
+           "boundTo: $boundTo" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["result"] = result;
+    map["boundTo"] = boundTo;
+    return map;
+  }
+}
+
+
+class NetworkServiceCreateTcpConnectedSocketParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(32, 0)
+  ];
+  net_address_mojom.NetAddress remoteAddress = null;
+  core.MojoDataPipeConsumer sendStream = null;
+  core.MojoDataPipeProducer receiveStream = null;
+  Object clientSocket = null;
+
+  NetworkServiceCreateTcpConnectedSocketParams() : super(kVersions.last.size);
+
+  static NetworkServiceCreateTcpConnectedSocketParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static NetworkServiceCreateTcpConnectedSocketParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    NetworkServiceCreateTcpConnectedSocketParams result = new NetworkServiceCreateTcpConnectedSocketParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, false);
+      result.remoteAddress = net_address_mojom.NetAddress.decode(decoder1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.sendStream = decoder0.decodeConsumerHandle(16, false);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.receiveStream = decoder0.decodeProducerHandle(20, false);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.clientSocket = decoder0.decodeInterfaceRequest(24, false, tcp_connected_socket_mojom.TcpConnectedSocketStub.newFromEndpoint);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(remoteAddress, 8, false);
+    
+    encoder0.encodeConsumerHandle(sendStream, 16, false);
+    
+    encoder0.encodeProducerHandle(receiveStream, 20, false);
+    
+    encoder0.encodeInterfaceRequest(clientSocket, 24, false);
+  }
+
+  String toString() {
+    return "NetworkServiceCreateTcpConnectedSocketParams("
+           "remoteAddress: $remoteAddress" ", "
+           "sendStream: $sendStream" ", "
+           "receiveStream: $receiveStream" ", "
+           "clientSocket: $clientSocket" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+
+class NetworkServiceCreateTcpConnectedSocketResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  network_error_mojom.NetworkError result = null;
+  net_address_mojom.NetAddress localAddress = null;
+
+  NetworkServiceCreateTcpConnectedSocketResponseParams() : super(kVersions.last.size);
+
+  static NetworkServiceCreateTcpConnectedSocketResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static NetworkServiceCreateTcpConnectedSocketResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    NetworkServiceCreateTcpConnectedSocketResponseParams result = new NetworkServiceCreateTcpConnectedSocketResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, false);
+      result.result = network_error_mojom.NetworkError.decode(decoder1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(16, true);
+      result.localAddress = net_address_mojom.NetAddress.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(result, 8, false);
+    
+    encoder0.encodeStruct(localAddress, 16, true);
+  }
+
+  String toString() {
+    return "NetworkServiceCreateTcpConnectedSocketResponseParams("
+           "result: $result" ", "
+           "localAddress: $localAddress" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["result"] = result;
+    map["localAddress"] = localAddress;
+    return map;
+  }
+}
+
+
+class NetworkServiceCreateUdpSocketParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  Object socket = null;
+
+  NetworkServiceCreateUdpSocketParams() : super(kVersions.last.size);
+
+  static NetworkServiceCreateUdpSocketParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static NetworkServiceCreateUdpSocketParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    NetworkServiceCreateUdpSocketParams result = new NetworkServiceCreateUdpSocketParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.socket = decoder0.decodeInterfaceRequest(8, false, udp_socket_mojom.UdpSocketStub.newFromEndpoint);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeInterfaceRequest(socket, 8, false);
+  }
+
+  String toString() {
+    return "NetworkServiceCreateUdpSocketParams("
+           "socket: $socket" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+
+class NetworkServiceCreateHttpServerParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  net_address_mojom.NetAddress localAddress = null;
+  Object delegate = null;
+
+  NetworkServiceCreateHttpServerParams() : super(kVersions.last.size);
+
+  static NetworkServiceCreateHttpServerParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static NetworkServiceCreateHttpServerParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    NetworkServiceCreateHttpServerParams result = new NetworkServiceCreateHttpServerParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, false);
+      result.localAddress = net_address_mojom.NetAddress.decode(decoder1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.delegate = decoder0.decodeServiceInterface(16, false, http_server_mojom.HttpServerDelegateProxy.newFromEndpoint);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(localAddress, 8, false);
+    
+    encoder0.encodeInterface(delegate, 16, false);
+  }
+
+  String toString() {
+    return "NetworkServiceCreateHttpServerParams("
+           "localAddress: $localAddress" ", "
+           "delegate: $delegate" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+
+class NetworkServiceCreateHttpServerResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  network_error_mojom.NetworkError result = null;
+  net_address_mojom.NetAddress boundTo = null;
+
+  NetworkServiceCreateHttpServerResponseParams() : super(kVersions.last.size);
+
+  static NetworkServiceCreateHttpServerResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static NetworkServiceCreateHttpServerResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    NetworkServiceCreateHttpServerResponseParams result = new NetworkServiceCreateHttpServerResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, false);
+      result.result = network_error_mojom.NetworkError.decode(decoder1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(16, true);
+      result.boundTo = net_address_mojom.NetAddress.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(result, 8, false);
+    
+    encoder0.encodeStruct(boundTo, 16, true);
+  }
+
+  String toString() {
+    return "NetworkServiceCreateHttpServerResponseParams("
+           "result: $result" ", "
+           "boundTo: $boundTo" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["result"] = result;
+    map["boundTo"] = boundTo;
+    return map;
+  }
+}
+
+
+class NetworkServiceRegisterUrlLoaderInterceptorParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  Object factory = null;
+
+  NetworkServiceRegisterUrlLoaderInterceptorParams() : super(kVersions.last.size);
+
+  static NetworkServiceRegisterUrlLoaderInterceptorParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static NetworkServiceRegisterUrlLoaderInterceptorParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    NetworkServiceRegisterUrlLoaderInterceptorParams result = new NetworkServiceRegisterUrlLoaderInterceptorParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.factory = decoder0.decodeServiceInterface(8, false, url_loader_interceptor_mojom.UrlLoaderInterceptorFactoryProxy.newFromEndpoint);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeInterface(factory, 8, false);
+  }
+
+  String toString() {
+    return "NetworkServiceRegisterUrlLoaderInterceptorParams("
+           "factory: $factory" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+
+class NetworkServiceCreateHostResolverParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  Object hostResolver = null;
+
+  NetworkServiceCreateHostResolverParams() : super(kVersions.last.size);
+
+  static NetworkServiceCreateHostResolverParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static NetworkServiceCreateHostResolverParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    NetworkServiceCreateHostResolverParams result = new NetworkServiceCreateHostResolverParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.hostResolver = decoder0.decodeInterfaceRequest(8, false, host_resolver_mojom.HostResolverStub.newFromEndpoint);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeInterfaceRequest(hostResolver, 8, false);
+  }
+
+  String toString() {
+    return "NetworkServiceCreateHostResolverParams("
+           "hostResolver: $hostResolver" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+const int kNetworkService_createUrlLoader_name = 0;
+const int kNetworkService_getCookieStore_name = 1;
+const int kNetworkService_createWebSocket_name = 2;
+const int kNetworkService_createTcpBoundSocket_name = 3;
+const int kNetworkService_createTcpConnectedSocket_name = 4;
+const int kNetworkService_createUdpSocket_name = 5;
+const int kNetworkService_createHttpServer_name = 6;
+const int kNetworkService_registerUrlLoaderInterceptor_name = 7;
+const int kNetworkService_createHostResolver_name = 8;
+
+const String NetworkServiceName =
+      'mojo::NetworkService';
+
+abstract class NetworkService {
+  void createUrlLoader(Object loader);
+  void getCookieStore(Object cookieStore);
+  void createWebSocket(Object socket);
+  dynamic createTcpBoundSocket(net_address_mojom.NetAddress localAddress,Object boundSocket,[Function responseFactory = null]);
+  dynamic createTcpConnectedSocket(net_address_mojom.NetAddress remoteAddress,core.MojoDataPipeConsumer sendStream,core.MojoDataPipeProducer receiveStream,Object clientSocket,[Function responseFactory = null]);
+  void createUdpSocket(Object socket);
+  dynamic createHttpServer(net_address_mojom.NetAddress localAddress,Object delegate,[Function responseFactory = null]);
+  void registerUrlLoaderInterceptor(Object factory);
+  void createHostResolver(Object hostResolver);
+
+}
+
+
+class NetworkServiceProxyImpl extends bindings.Proxy {
+  NetworkServiceProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  NetworkServiceProxyImpl.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);
+  }
+
+  String get name => NetworkServiceName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      case kNetworkService_createTcpBoundSocket_name:
+        var r = NetworkServiceCreateTcpBoundSocketResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      case kNetworkService_createTcpConnectedSocket_name:
+        var r = NetworkServiceCreateTcpConnectedSocketResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      case kNetworkService_createHttpServer_name:
+        var r = NetworkServiceCreateHttpServerResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "NetworkServiceProxyImpl($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, kNetworkService_createUrlLoader_name);
+    }
+  
+    void getCookieStore(Object cookieStore) {
+      if (!_proxyImpl.isBound) {
+        _proxyImpl.proxyError("The Proxy is closed.");
+        return;
+      }
+      var params = new NetworkServiceGetCookieStoreParams();
+      params.cookieStore = cookieStore;
+      _proxyImpl.sendMessage(params, kNetworkService_getCookieStore_name);
+    }
+  
+    void createWebSocket(Object socket) {
+      if (!_proxyImpl.isBound) {
+        _proxyImpl.proxyError("The Proxy is closed.");
+        return;
+      }
+      var params = new NetworkServiceCreateWebSocketParams();
+      params.socket = socket;
+      _proxyImpl.sendMessage(params, kNetworkService_createWebSocket_name);
+    }
+  
+    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,
+          kNetworkService_createTcpBoundSocket_name,
+          -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,
+          kNetworkService_createTcpConnectedSocket_name,
+          -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, kNetworkService_createUdpSocket_name);
+    }
+  
+    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,
+          kNetworkService_createHttpServer_name,
+          -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, kNetworkService_registerUrlLoaderInterceptor_name);
+    }
+  
+    void createHostResolver(Object hostResolver) {
+      if (!_proxyImpl.isBound) {
+        _proxyImpl.proxyError("The Proxy is closed.");
+        return;
+      }
+      var params = new NetworkServiceCreateHostResolverParams();
+      params.hostResolver = hostResolver;
+      _proxyImpl.sendMessage(params, kNetworkService_createHostResolver_name);
+    }
+  
+}
+
+
+class NetworkServiceProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  NetworkService ptr;
+  final String name = NetworkServiceName;
+
+  NetworkServiceProxy(NetworkServiceProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _NetworkServiceProxyCalls(proxyImpl);
+
+  NetworkServiceProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new NetworkServiceProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _NetworkServiceProxyCalls(impl);
+  }
+
+  NetworkServiceProxy.fromHandle(core.MojoHandle handle) :
+      impl = new NetworkServiceProxyImpl.fromHandle(handle) {
+    ptr = new _NetworkServiceProxyCalls(impl);
+  }
+
+  NetworkServiceProxy.unbound() :
+      impl = new NetworkServiceProxyImpl.unbound() {
+    ptr = new _NetworkServiceProxyCalls(impl);
+  }
+
+  factory NetworkServiceProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    NetworkServiceProxy p = new NetworkServiceProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static NetworkServiceProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For NetworkServiceProxy"));
+    return new NetworkServiceProxy.fromEndpoint(endpoint);
+  }
+
+  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 "NetworkServiceProxy($impl)";
+  }
+}
+
+
+class NetworkServiceStub extends bindings.Stub {
+  NetworkService _impl = null;
+
+  NetworkServiceStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  NetworkServiceStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  NetworkServiceStub.unbound() : super.unbound();
+
+  static NetworkServiceStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For NetworkServiceStub"));
+    return new NetworkServiceStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = NetworkServiceName;
+
+
+  NetworkServiceCreateTcpBoundSocketResponseParams _NetworkServiceCreateTcpBoundSocketResponseParamsFactory(network_error_mojom.NetworkError result, net_address_mojom.NetAddress boundTo) {
+    var result = new NetworkServiceCreateTcpBoundSocketResponseParams();
+    result.result = result;
+    result.boundTo = boundTo;
+    return result;
+  }
+  NetworkServiceCreateTcpConnectedSocketResponseParams _NetworkServiceCreateTcpConnectedSocketResponseParamsFactory(network_error_mojom.NetworkError result, net_address_mojom.NetAddress localAddress) {
+    var result = new NetworkServiceCreateTcpConnectedSocketResponseParams();
+    result.result = result;
+    result.localAddress = localAddress;
+    return result;
+  }
+  NetworkServiceCreateHttpServerResponseParams _NetworkServiceCreateHttpServerResponseParamsFactory(network_error_mojom.NetworkError result, net_address_mojom.NetAddress boundTo) {
+    var result = new NetworkServiceCreateHttpServerResponseParams();
+    result.result = result;
+    result.boundTo = boundTo;
+    return result;
+  }
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      case kNetworkService_createUrlLoader_name:
+        var params = NetworkServiceCreateUrlLoaderParams.deserialize(
+            message.payload);
+        _impl.createUrlLoader(params.loader);
+        break;
+      case kNetworkService_getCookieStore_name:
+        var params = NetworkServiceGetCookieStoreParams.deserialize(
+            message.payload);
+        _impl.getCookieStore(params.cookieStore);
+        break;
+      case kNetworkService_createWebSocket_name:
+        var params = NetworkServiceCreateWebSocketParams.deserialize(
+            message.payload);
+        _impl.createWebSocket(params.socket);
+        break;
+      case kNetworkService_createTcpBoundSocket_name:
+        var params = NetworkServiceCreateTcpBoundSocketParams.deserialize(
+            message.payload);
+        var response = _impl.createTcpBoundSocket(params.localAddress,params.boundSocket,_NetworkServiceCreateTcpBoundSocketResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kNetworkService_createTcpBoundSocket_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kNetworkService_createTcpBoundSocket_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      case kNetworkService_createTcpConnectedSocket_name:
+        var params = NetworkServiceCreateTcpConnectedSocketParams.deserialize(
+            message.payload);
+        var response = _impl.createTcpConnectedSocket(params.remoteAddress,params.sendStream,params.receiveStream,params.clientSocket,_NetworkServiceCreateTcpConnectedSocketResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kNetworkService_createTcpConnectedSocket_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kNetworkService_createTcpConnectedSocket_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      case kNetworkService_createUdpSocket_name:
+        var params = NetworkServiceCreateUdpSocketParams.deserialize(
+            message.payload);
+        _impl.createUdpSocket(params.socket);
+        break;
+      case kNetworkService_createHttpServer_name:
+        var params = NetworkServiceCreateHttpServerParams.deserialize(
+            message.payload);
+        var response = _impl.createHttpServer(params.localAddress,params.delegate,_NetworkServiceCreateHttpServerResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kNetworkService_createHttpServer_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kNetworkService_createHttpServer_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      case kNetworkService_registerUrlLoaderInterceptor_name:
+        var params = NetworkServiceRegisterUrlLoaderInterceptorParams.deserialize(
+            message.payload);
+        _impl.registerUrlLoaderInterceptor(params.factory);
+        break;
+      case kNetworkService_createHostResolver_name:
+        var params = NetworkServiceCreateHostResolverParams.deserialize(
+            message.payload);
+        _impl.createHostResolver(params.hostResolver);
+        break;
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  NetworkService get impl => _impl;
+  set impl(NetworkService d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "NetworkServiceStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/quads.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/quads.mojom.dart
new file mode 100644
index 0000000..52493f6
--- /dev/null
+++ b/mojo/dart/packages/mojo_services/lib/mojo/quads.mojom.dart
@@ -0,0 +1,1939 @@
+// 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.
+
+library quads_mojom;
+
+import 'dart:async';
+
+import 'package:mojo/bindings.dart' as bindings;
+import 'package:mojo/core.dart' as core;
+import 'package:mojo_services/mojo/geometry.mojom.dart' as geometry_mojom;
+import 'package:mojo_services/mojo/surface_id.mojom.dart' as surface_id_mojom;
+class YuvColorSpace extends bindings.MojoEnum {
+  static const REC_601 = const YuvColorSpace._(0);
+  static const REC_709 = const YuvColorSpace._(1);
+  static const JPEG = const YuvColorSpace._(2);
+
+  const YuvColorSpace._(int v) : super(v);
+
+  static const Map<String, YuvColorSpace> valuesMap = const {
+    "REC_601": REC_601,
+    "REC_709": REC_709,
+    "JPEG": JPEG,
+  };
+  static const List<YuvColorSpace> values = const [
+    REC_601,
+    REC_709,
+    JPEG,
+  ];
+
+  static YuvColorSpace valueOf(String name) => valuesMap[name];
+
+  factory YuvColorSpace(int v) {
+    switch (v) {
+      case 0:
+        return REC_601;
+      case 1:
+        return REC_709;
+      case 2:
+        return JPEG;
+      default:
+        return null;
+    }
+  }
+
+  static YuvColorSpace decode(bindings.Decoder decoder0, int offset) {
+    int v = decoder0.decodeUint32(offset);
+    YuvColorSpace result = new YuvColorSpace(v);
+    if (result == null) {
+      throw new bindings.MojoCodecError(
+          'Bad value $v for enum YuvColorSpace.');
+    }
+    return result;
+  }
+
+  String toString() {
+    switch(this) {
+      case REC_601:
+        return 'YuvColorSpace.REC_601';
+      case REC_709:
+        return 'YuvColorSpace.REC_709';
+      case JPEG:
+        return 'YuvColorSpace.JPEG';
+    }
+  }
+
+  int toJson() => value;
+}
+class Material extends bindings.MojoEnum {
+  static const CHECKERBOARD = const Material._(1);
+  static const DEBUG_BORDER = const Material._(2);
+  static const IO_SURFACE_CONTENT = const Material._(3);
+  static const PICTURE_CONTENT = const Material._(4);
+  static const RENDER_PASS = const Material._(5);
+  static const SOLID_COLOR = const Material._(6);
+  static const STREAM_VIDEO_CONTENT = const Material._(7);
+  static const SURFACE_CONTENT = const Material._(8);
+  static const TEXTURE_CONTENT = const Material._(9);
+  static const TILED_CONTENT = const Material._(10);
+  static const YUV_VIDEO_CONTENT = const Material._(11);
+
+  const Material._(int v) : super(v);
+
+  static const Map<String, Material> valuesMap = const {
+    "CHECKERBOARD": CHECKERBOARD,
+    "DEBUG_BORDER": DEBUG_BORDER,
+    "IO_SURFACE_CONTENT": IO_SURFACE_CONTENT,
+    "PICTURE_CONTENT": PICTURE_CONTENT,
+    "RENDER_PASS": RENDER_PASS,
+    "SOLID_COLOR": SOLID_COLOR,
+    "STREAM_VIDEO_CONTENT": STREAM_VIDEO_CONTENT,
+    "SURFACE_CONTENT": SURFACE_CONTENT,
+    "TEXTURE_CONTENT": TEXTURE_CONTENT,
+    "TILED_CONTENT": TILED_CONTENT,
+    "YUV_VIDEO_CONTENT": YUV_VIDEO_CONTENT,
+  };
+  static const List<Material> values = const [
+    CHECKERBOARD,
+    DEBUG_BORDER,
+    IO_SURFACE_CONTENT,
+    PICTURE_CONTENT,
+    RENDER_PASS,
+    SOLID_COLOR,
+    STREAM_VIDEO_CONTENT,
+    SURFACE_CONTENT,
+    TEXTURE_CONTENT,
+    TILED_CONTENT,
+    YUV_VIDEO_CONTENT,
+  ];
+
+  static Material valueOf(String name) => valuesMap[name];
+
+  factory Material(int v) {
+    switch (v) {
+      case 1:
+        return CHECKERBOARD;
+      case 2:
+        return DEBUG_BORDER;
+      case 3:
+        return IO_SURFACE_CONTENT;
+      case 4:
+        return PICTURE_CONTENT;
+      case 5:
+        return RENDER_PASS;
+      case 6:
+        return SOLID_COLOR;
+      case 7:
+        return STREAM_VIDEO_CONTENT;
+      case 8:
+        return SURFACE_CONTENT;
+      case 9:
+        return TEXTURE_CONTENT;
+      case 10:
+        return TILED_CONTENT;
+      case 11:
+        return YUV_VIDEO_CONTENT;
+      default:
+        return null;
+    }
+  }
+
+  static Material decode(bindings.Decoder decoder0, int offset) {
+    int v = decoder0.decodeUint32(offset);
+    Material result = new Material(v);
+    if (result == null) {
+      throw new bindings.MojoCodecError(
+          'Bad value $v for enum Material.');
+    }
+    return result;
+  }
+
+  String toString() {
+    switch(this) {
+      case CHECKERBOARD:
+        return 'Material.CHECKERBOARD';
+      case DEBUG_BORDER:
+        return 'Material.DEBUG_BORDER';
+      case IO_SURFACE_CONTENT:
+        return 'Material.IO_SURFACE_CONTENT';
+      case PICTURE_CONTENT:
+        return 'Material.PICTURE_CONTENT';
+      case RENDER_PASS:
+        return 'Material.RENDER_PASS';
+      case SOLID_COLOR:
+        return 'Material.SOLID_COLOR';
+      case STREAM_VIDEO_CONTENT:
+        return 'Material.STREAM_VIDEO_CONTENT';
+      case SURFACE_CONTENT:
+        return 'Material.SURFACE_CONTENT';
+      case TEXTURE_CONTENT:
+        return 'Material.TEXTURE_CONTENT';
+      case TILED_CONTENT:
+        return 'Material.TILED_CONTENT';
+      case YUV_VIDEO_CONTENT:
+        return 'Material.YUV_VIDEO_CONTENT';
+    }
+  }
+
+  int toJson() => value;
+}
+class SkXfermode extends bindings.MojoEnum {
+  static const kClear_Mode = const SkXfermode._(0);
+  static const kSrc_Mode = const SkXfermode._(1);
+  static const kDst_Mode = const SkXfermode._(2);
+  static const kSrcOver_Mode = const SkXfermode._(3);
+  static const kDstOver_Mode = const SkXfermode._(4);
+  static const kSrcIn_Mode = const SkXfermode._(5);
+  static const kDstIn_Mode = const SkXfermode._(6);
+  static const kSrcOut_Mode = const SkXfermode._(7);
+  static const kDstOut_Mode = const SkXfermode._(8);
+  static const kSrcATop_Mode = const SkXfermode._(9);
+  static const kDstATop_Mode = const SkXfermode._(10);
+  static const kXor_Mode = const SkXfermode._(11);
+  static const kPlus_Mode = const SkXfermode._(12);
+  static const kModulate_Mode = const SkXfermode._(13);
+  static const kScreen_Mode = const SkXfermode._(14);
+  static const kLastCoeffMode = const SkXfermode._(14);
+  static const kOverlay_Mode = const SkXfermode._(15);
+  static const kDarken_Mode = const SkXfermode._(16);
+  static const kLighten_Mode = const SkXfermode._(17);
+  static const kColorDodge_Mode = const SkXfermode._(18);
+  static const kColorBurn_Mode = const SkXfermode._(19);
+  static const kHardLight_Mode = const SkXfermode._(20);
+  static const kSoftLight_Mode = const SkXfermode._(21);
+  static const kDifference_Mode = const SkXfermode._(22);
+  static const kExclusion_Mode = const SkXfermode._(23);
+  static const kMultiply_Mode = const SkXfermode._(24);
+  static const kLastSeparableMode = const SkXfermode._(24);
+  static const kHue_Mode = const SkXfermode._(25);
+  static const kSaturation_Mode = const SkXfermode._(26);
+  static const kColor_Mode = const SkXfermode._(27);
+  static const kLuminosity_Mode = const SkXfermode._(28);
+  static const kLastMode = const SkXfermode._(28);
+
+  const SkXfermode._(int v) : super(v);
+
+  static const Map<String, SkXfermode> valuesMap = const {
+    "kClear_Mode": kClear_Mode,
+    "kSrc_Mode": kSrc_Mode,
+    "kDst_Mode": kDst_Mode,
+    "kSrcOver_Mode": kSrcOver_Mode,
+    "kDstOver_Mode": kDstOver_Mode,
+    "kSrcIn_Mode": kSrcIn_Mode,
+    "kDstIn_Mode": kDstIn_Mode,
+    "kSrcOut_Mode": kSrcOut_Mode,
+    "kDstOut_Mode": kDstOut_Mode,
+    "kSrcATop_Mode": kSrcATop_Mode,
+    "kDstATop_Mode": kDstATop_Mode,
+    "kXor_Mode": kXor_Mode,
+    "kPlus_Mode": kPlus_Mode,
+    "kModulate_Mode": kModulate_Mode,
+    "kScreen_Mode": kScreen_Mode,
+    "kLastCoeffMode": kLastCoeffMode,
+    "kOverlay_Mode": kOverlay_Mode,
+    "kDarken_Mode": kDarken_Mode,
+    "kLighten_Mode": kLighten_Mode,
+    "kColorDodge_Mode": kColorDodge_Mode,
+    "kColorBurn_Mode": kColorBurn_Mode,
+    "kHardLight_Mode": kHardLight_Mode,
+    "kSoftLight_Mode": kSoftLight_Mode,
+    "kDifference_Mode": kDifference_Mode,
+    "kExclusion_Mode": kExclusion_Mode,
+    "kMultiply_Mode": kMultiply_Mode,
+    "kLastSeparableMode": kLastSeparableMode,
+    "kHue_Mode": kHue_Mode,
+    "kSaturation_Mode": kSaturation_Mode,
+    "kColor_Mode": kColor_Mode,
+    "kLuminosity_Mode": kLuminosity_Mode,
+    "kLastMode": kLastMode,
+  };
+  static const List<SkXfermode> values = const [
+    kClear_Mode,
+    kSrc_Mode,
+    kDst_Mode,
+    kSrcOver_Mode,
+    kDstOver_Mode,
+    kSrcIn_Mode,
+    kDstIn_Mode,
+    kSrcOut_Mode,
+    kDstOut_Mode,
+    kSrcATop_Mode,
+    kDstATop_Mode,
+    kXor_Mode,
+    kPlus_Mode,
+    kModulate_Mode,
+    kScreen_Mode,
+    kLastCoeffMode,
+    kOverlay_Mode,
+    kDarken_Mode,
+    kLighten_Mode,
+    kColorDodge_Mode,
+    kColorBurn_Mode,
+    kHardLight_Mode,
+    kSoftLight_Mode,
+    kDifference_Mode,
+    kExclusion_Mode,
+    kMultiply_Mode,
+    kLastSeparableMode,
+    kHue_Mode,
+    kSaturation_Mode,
+    kColor_Mode,
+    kLuminosity_Mode,
+    kLastMode,
+  ];
+
+  static SkXfermode valueOf(String name) => valuesMap[name];
+
+  factory SkXfermode(int v) {
+    switch (v) {
+      case 0:
+        return kClear_Mode;
+      case 1:
+        return kSrc_Mode;
+      case 2:
+        return kDst_Mode;
+      case 3:
+        return kSrcOver_Mode;
+      case 4:
+        return kDstOver_Mode;
+      case 5:
+        return kSrcIn_Mode;
+      case 6:
+        return kDstIn_Mode;
+      case 7:
+        return kSrcOut_Mode;
+      case 8:
+        return kDstOut_Mode;
+      case 9:
+        return kSrcATop_Mode;
+      case 10:
+        return kDstATop_Mode;
+      case 11:
+        return kXor_Mode;
+      case 12:
+        return kPlus_Mode;
+      case 13:
+        return kModulate_Mode;
+      case 14:
+        return kScreen_Mode;
+      case 14:
+        return kLastCoeffMode;
+      case 15:
+        return kOverlay_Mode;
+      case 16:
+        return kDarken_Mode;
+      case 17:
+        return kLighten_Mode;
+      case 18:
+        return kColorDodge_Mode;
+      case 19:
+        return kColorBurn_Mode;
+      case 20:
+        return kHardLight_Mode;
+      case 21:
+        return kSoftLight_Mode;
+      case 22:
+        return kDifference_Mode;
+      case 23:
+        return kExclusion_Mode;
+      case 24:
+        return kMultiply_Mode;
+      case 24:
+        return kLastSeparableMode;
+      case 25:
+        return kHue_Mode;
+      case 26:
+        return kSaturation_Mode;
+      case 27:
+        return kColor_Mode;
+      case 28:
+        return kLuminosity_Mode;
+      case 28:
+        return kLastMode;
+      default:
+        return null;
+    }
+  }
+
+  static SkXfermode decode(bindings.Decoder decoder0, int offset) {
+    int v = decoder0.decodeUint32(offset);
+    SkXfermode result = new SkXfermode(v);
+    if (result == null) {
+      throw new bindings.MojoCodecError(
+          'Bad value $v for enum SkXfermode.');
+    }
+    return result;
+  }
+
+  String toString() {
+    switch(this) {
+      case kClear_Mode:
+        return 'SkXfermode.kClear_Mode';
+      case kSrc_Mode:
+        return 'SkXfermode.kSrc_Mode';
+      case kDst_Mode:
+        return 'SkXfermode.kDst_Mode';
+      case kSrcOver_Mode:
+        return 'SkXfermode.kSrcOver_Mode';
+      case kDstOver_Mode:
+        return 'SkXfermode.kDstOver_Mode';
+      case kSrcIn_Mode:
+        return 'SkXfermode.kSrcIn_Mode';
+      case kDstIn_Mode:
+        return 'SkXfermode.kDstIn_Mode';
+      case kSrcOut_Mode:
+        return 'SkXfermode.kSrcOut_Mode';
+      case kDstOut_Mode:
+        return 'SkXfermode.kDstOut_Mode';
+      case kSrcATop_Mode:
+        return 'SkXfermode.kSrcATop_Mode';
+      case kDstATop_Mode:
+        return 'SkXfermode.kDstATop_Mode';
+      case kXor_Mode:
+        return 'SkXfermode.kXor_Mode';
+      case kPlus_Mode:
+        return 'SkXfermode.kPlus_Mode';
+      case kModulate_Mode:
+        return 'SkXfermode.kModulate_Mode';
+      case kScreen_Mode:
+        return 'SkXfermode.kScreen_Mode';
+      case kLastCoeffMode:
+        return 'SkXfermode.kLastCoeffMode';
+      case kOverlay_Mode:
+        return 'SkXfermode.kOverlay_Mode';
+      case kDarken_Mode:
+        return 'SkXfermode.kDarken_Mode';
+      case kLighten_Mode:
+        return 'SkXfermode.kLighten_Mode';
+      case kColorDodge_Mode:
+        return 'SkXfermode.kColorDodge_Mode';
+      case kColorBurn_Mode:
+        return 'SkXfermode.kColorBurn_Mode';
+      case kHardLight_Mode:
+        return 'SkXfermode.kHardLight_Mode';
+      case kSoftLight_Mode:
+        return 'SkXfermode.kSoftLight_Mode';
+      case kDifference_Mode:
+        return 'SkXfermode.kDifference_Mode';
+      case kExclusion_Mode:
+        return 'SkXfermode.kExclusion_Mode';
+      case kMultiply_Mode:
+        return 'SkXfermode.kMultiply_Mode';
+      case kLastSeparableMode:
+        return 'SkXfermode.kLastSeparableMode';
+      case kHue_Mode:
+        return 'SkXfermode.kHue_Mode';
+      case kSaturation_Mode:
+        return 'SkXfermode.kSaturation_Mode';
+      case kColor_Mode:
+        return 'SkXfermode.kColor_Mode';
+      case kLuminosity_Mode:
+        return 'SkXfermode.kLuminosity_Mode';
+      case kLastMode:
+        return 'SkXfermode.kLastMode';
+    }
+  }
+
+  int toJson() => value;
+}
+
+
+
+class Color extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  int rgba = 0;
+
+  Color() : super(kVersions.last.size);
+
+  static Color deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static Color decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    Color result = new Color();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.rgba = decoder0.decodeUint32(8);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeUint32(rgba, 8);
+  }
+
+  String toString() {
+    return "Color("
+           "rgba: $rgba" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["rgba"] = rgba;
+    return map;
+  }
+}
+
+
+class CheckerboardQuadState extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(8, 0)
+  ];
+
+  CheckerboardQuadState() : super(kVersions.last.size);
+
+  static CheckerboardQuadState deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static CheckerboardQuadState decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    CheckerboardQuadState result = new CheckerboardQuadState();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    encoder.getStructEncoderAtOffset(kVersions.last);
+  }
+
+  String toString() {
+    return "CheckerboardQuadState("")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    return map;
+  }
+}
+
+
+class DebugBorderQuadState extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(8, 0)
+  ];
+
+  DebugBorderQuadState() : super(kVersions.last.size);
+
+  static DebugBorderQuadState deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static DebugBorderQuadState decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    DebugBorderQuadState result = new DebugBorderQuadState();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    encoder.getStructEncoderAtOffset(kVersions.last);
+  }
+
+  String toString() {
+    return "DebugBorderQuadState("")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    return map;
+  }
+}
+
+
+class IoSurfaceContentQuadState extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(8, 0)
+  ];
+
+  IoSurfaceContentQuadState() : super(kVersions.last.size);
+
+  static IoSurfaceContentQuadState deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static IoSurfaceContentQuadState decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    IoSurfaceContentQuadState result = new IoSurfaceContentQuadState();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    encoder.getStructEncoderAtOffset(kVersions.last);
+  }
+
+  String toString() {
+    return "IoSurfaceContentQuadState("")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    return map;
+  }
+}
+
+
+class RenderPassId extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  int layerId = 0;
+  int index = 0;
+
+  RenderPassId() : super(kVersions.last.size);
+
+  static RenderPassId deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static RenderPassId decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    RenderPassId result = new RenderPassId();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.layerId = decoder0.decodeInt32(8);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.index = decoder0.decodeInt32(12);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeInt32(layerId, 8);
+    
+    encoder0.encodeInt32(index, 12);
+  }
+
+  String toString() {
+    return "RenderPassId("
+           "layerId: $layerId" ", "
+           "index: $index" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["layerId"] = layerId;
+    map["index"] = index;
+    return map;
+  }
+}
+
+
+class RenderPassQuadState extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(48, 0)
+  ];
+  RenderPassId renderPassId = null;
+  int maskResourceId = 0;
+  geometry_mojom.PointF maskUvScale = null;
+  geometry_mojom.Size maskTextureSize = null;
+  geometry_mojom.PointF filtersScale = null;
+
+  RenderPassQuadState() : super(kVersions.last.size);
+
+  static RenderPassQuadState deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static RenderPassQuadState decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    RenderPassQuadState result = new RenderPassQuadState();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, false);
+      result.renderPassId = RenderPassId.decode(decoder1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.maskResourceId = decoder0.decodeUint32(16);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(24, false);
+      result.maskUvScale = geometry_mojom.PointF.decode(decoder1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(32, false);
+      result.maskTextureSize = geometry_mojom.Size.decode(decoder1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(40, false);
+      result.filtersScale = geometry_mojom.PointF.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(renderPassId, 8, false);
+    
+    encoder0.encodeUint32(maskResourceId, 16);
+    
+    encoder0.encodeStruct(maskUvScale, 24, false);
+    
+    encoder0.encodeStruct(maskTextureSize, 32, false);
+    
+    encoder0.encodeStruct(filtersScale, 40, false);
+  }
+
+  String toString() {
+    return "RenderPassQuadState("
+           "renderPassId: $renderPassId" ", "
+           "maskResourceId: $maskResourceId" ", "
+           "maskUvScale: $maskUvScale" ", "
+           "maskTextureSize: $maskTextureSize" ", "
+           "filtersScale: $filtersScale" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["renderPassId"] = renderPassId;
+    map["maskResourceId"] = maskResourceId;
+    map["maskUvScale"] = maskUvScale;
+    map["maskTextureSize"] = maskTextureSize;
+    map["filtersScale"] = filtersScale;
+    return map;
+  }
+}
+
+
+class SolidColorQuadState extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  Color color = null;
+  bool forceAntiAliasingOff = false;
+
+  SolidColorQuadState() : super(kVersions.last.size);
+
+  static SolidColorQuadState deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static SolidColorQuadState decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    SolidColorQuadState result = new SolidColorQuadState();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, false);
+      result.color = Color.decode(decoder1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.forceAntiAliasingOff = decoder0.decodeBool(16, 0);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(color, 8, false);
+    
+    encoder0.encodeBool(forceAntiAliasingOff, 16, 0);
+  }
+
+  String toString() {
+    return "SolidColorQuadState("
+           "color: $color" ", "
+           "forceAntiAliasingOff: $forceAntiAliasingOff" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["color"] = color;
+    map["forceAntiAliasingOff"] = forceAntiAliasingOff;
+    return map;
+  }
+}
+
+
+class SurfaceQuadState extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  surface_id_mojom.SurfaceId surface = null;
+
+  SurfaceQuadState() : super(kVersions.last.size);
+
+  static SurfaceQuadState deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static SurfaceQuadState decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    SurfaceQuadState result = new SurfaceQuadState();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, false);
+      result.surface = surface_id_mojom.SurfaceId.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(surface, 8, false);
+  }
+
+  String toString() {
+    return "SurfaceQuadState("
+           "surface: $surface" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["surface"] = surface;
+    return map;
+  }
+}
+
+
+class TextureQuadState extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(48, 0)
+  ];
+  int resourceId = 0;
+  bool premultipliedAlpha = false;
+  bool flipped = false;
+  bool nearestNeighbor = false;
+  geometry_mojom.PointF uvTopLeft = null;
+  geometry_mojom.PointF uvBottomRight = null;
+  Color backgroundColor = null;
+  List<double> vertexOpacity = null;
+
+  TextureQuadState() : super(kVersions.last.size);
+
+  static TextureQuadState deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static TextureQuadState decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    TextureQuadState result = new TextureQuadState();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.resourceId = decoder0.decodeUint32(8);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.premultipliedAlpha = decoder0.decodeBool(12, 0);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.flipped = decoder0.decodeBool(12, 1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.nearestNeighbor = decoder0.decodeBool(12, 2);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(16, false);
+      result.uvTopLeft = geometry_mojom.PointF.decode(decoder1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(24, false);
+      result.uvBottomRight = geometry_mojom.PointF.decode(decoder1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(32, false);
+      result.backgroundColor = Color.decode(decoder1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.vertexOpacity = decoder0.decodeFloatArray(40, bindings.kNothingNullable, 4);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeUint32(resourceId, 8);
+    
+    encoder0.encodeBool(premultipliedAlpha, 12, 0);
+    
+    encoder0.encodeBool(flipped, 12, 1);
+    
+    encoder0.encodeBool(nearestNeighbor, 12, 2);
+    
+    encoder0.encodeStruct(uvTopLeft, 16, false);
+    
+    encoder0.encodeStruct(uvBottomRight, 24, false);
+    
+    encoder0.encodeStruct(backgroundColor, 32, false);
+    
+    encoder0.encodeFloatArray(vertexOpacity, 40, bindings.kNothingNullable, 4);
+  }
+
+  String toString() {
+    return "TextureQuadState("
+           "resourceId: $resourceId" ", "
+           "premultipliedAlpha: $premultipliedAlpha" ", "
+           "flipped: $flipped" ", "
+           "nearestNeighbor: $nearestNeighbor" ", "
+           "uvTopLeft: $uvTopLeft" ", "
+           "uvBottomRight: $uvBottomRight" ", "
+           "backgroundColor: $backgroundColor" ", "
+           "vertexOpacity: $vertexOpacity" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["resourceId"] = resourceId;
+    map["premultipliedAlpha"] = premultipliedAlpha;
+    map["flipped"] = flipped;
+    map["nearestNeighbor"] = nearestNeighbor;
+    map["uvTopLeft"] = uvTopLeft;
+    map["uvBottomRight"] = uvBottomRight;
+    map["backgroundColor"] = backgroundColor;
+    map["vertexOpacity"] = vertexOpacity;
+    return map;
+  }
+}
+
+
+class TileQuadState extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(32, 0)
+  ];
+  geometry_mojom.RectF texCoordRect = null;
+  geometry_mojom.Size textureSize = null;
+  bool swizzleContents = false;
+  bool nearestNeighbor = false;
+  int resourceId = 0;
+
+  TileQuadState() : super(kVersions.last.size);
+
+  static TileQuadState deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static TileQuadState decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    TileQuadState result = new TileQuadState();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, false);
+      result.texCoordRect = geometry_mojom.RectF.decode(decoder1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(16, false);
+      result.textureSize = geometry_mojom.Size.decode(decoder1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.swizzleContents = decoder0.decodeBool(24, 0);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.nearestNeighbor = decoder0.decodeBool(24, 1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.resourceId = decoder0.decodeUint32(28);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(texCoordRect, 8, false);
+    
+    encoder0.encodeStruct(textureSize, 16, false);
+    
+    encoder0.encodeBool(swizzleContents, 24, 0);
+    
+    encoder0.encodeBool(nearestNeighbor, 24, 1);
+    
+    encoder0.encodeUint32(resourceId, 28);
+  }
+
+  String toString() {
+    return "TileQuadState("
+           "texCoordRect: $texCoordRect" ", "
+           "textureSize: $textureSize" ", "
+           "swizzleContents: $swizzleContents" ", "
+           "nearestNeighbor: $nearestNeighbor" ", "
+           "resourceId: $resourceId" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["texCoordRect"] = texCoordRect;
+    map["textureSize"] = textureSize;
+    map["swizzleContents"] = swizzleContents;
+    map["nearestNeighbor"] = nearestNeighbor;
+    map["resourceId"] = resourceId;
+    return map;
+  }
+}
+
+
+class StreamVideoQuadState extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(8, 0)
+  ];
+
+  StreamVideoQuadState() : super(kVersions.last.size);
+
+  static StreamVideoQuadState deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static StreamVideoQuadState decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    StreamVideoQuadState result = new StreamVideoQuadState();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    encoder.getStructEncoderAtOffset(kVersions.last);
+  }
+
+  String toString() {
+    return "StreamVideoQuadState("")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    return map;
+  }
+}
+
+
+class YuvVideoQuadState extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(40, 0)
+  ];
+  geometry_mojom.RectF texCoordRect = null;
+  int yPlaneResourceId = 0;
+  int uPlaneResourceId = 0;
+  int vPlaneResourceId = 0;
+  int aPlaneResourceId = 0;
+  YuvColorSpace colorSpace = null;
+
+  YuvVideoQuadState() : super(kVersions.last.size);
+
+  static YuvVideoQuadState deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static YuvVideoQuadState decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    YuvVideoQuadState result = new YuvVideoQuadState();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, false);
+      result.texCoordRect = geometry_mojom.RectF.decode(decoder1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.yPlaneResourceId = decoder0.decodeUint32(16);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.uPlaneResourceId = decoder0.decodeUint32(20);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.vPlaneResourceId = decoder0.decodeUint32(24);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.aPlaneResourceId = decoder0.decodeUint32(28);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+        result.colorSpace = YuvColorSpace.decode(decoder0, 32);
+        if (result.colorSpace == null) {
+          throw new bindings.MojoCodecError(
+            'Trying to decode null union for non-nullable YuvColorSpace.');
+        }
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(texCoordRect, 8, false);
+    
+    encoder0.encodeUint32(yPlaneResourceId, 16);
+    
+    encoder0.encodeUint32(uPlaneResourceId, 20);
+    
+    encoder0.encodeUint32(vPlaneResourceId, 24);
+    
+    encoder0.encodeUint32(aPlaneResourceId, 28);
+    
+    encoder0.encodeEnum(colorSpace, 32);
+  }
+
+  String toString() {
+    return "YuvVideoQuadState("
+           "texCoordRect: $texCoordRect" ", "
+           "yPlaneResourceId: $yPlaneResourceId" ", "
+           "uPlaneResourceId: $uPlaneResourceId" ", "
+           "vPlaneResourceId: $vPlaneResourceId" ", "
+           "aPlaneResourceId: $aPlaneResourceId" ", "
+           "colorSpace: $colorSpace" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["texCoordRect"] = texCoordRect;
+    map["yPlaneResourceId"] = yPlaneResourceId;
+    map["uPlaneResourceId"] = uPlaneResourceId;
+    map["vPlaneResourceId"] = vPlaneResourceId;
+    map["aPlaneResourceId"] = aPlaneResourceId;
+    map["colorSpace"] = colorSpace;
+    return map;
+  }
+}
+
+
+class Quad extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(128, 0)
+  ];
+  Material material = null;
+  bool needsBlending = false;
+  geometry_mojom.Rect rect = null;
+  geometry_mojom.Rect opaqueRect = null;
+  geometry_mojom.Rect visibleRect = null;
+  int sharedQuadStateIndex = 0;
+  CheckerboardQuadState checkerboardQuadState = null;
+  DebugBorderQuadState debugBorderQuadState = null;
+  IoSurfaceContentQuadState ioSurfaceQuadState = null;
+  RenderPassQuadState renderPassQuadState = null;
+  SolidColorQuadState solidColorQuadState = null;
+  SurfaceQuadState surfaceQuadState = null;
+  TextureQuadState textureQuadState = null;
+  TileQuadState tileQuadState = null;
+  StreamVideoQuadState streamVideoQuadState = null;
+  YuvVideoQuadState yuvVideoQuadState = null;
+
+  Quad() : super(kVersions.last.size);
+
+  static Quad deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static Quad decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    Quad result = new Quad();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+        result.material = Material.decode(decoder0, 8);
+        if (result.material == null) {
+          throw new bindings.MojoCodecError(
+            'Trying to decode null union for non-nullable Material.');
+        }
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.needsBlending = decoder0.decodeBool(12, 0);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(16, false);
+      result.rect = geometry_mojom.Rect.decode(decoder1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(24, false);
+      result.opaqueRect = geometry_mojom.Rect.decode(decoder1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(32, false);
+      result.visibleRect = geometry_mojom.Rect.decode(decoder1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.sharedQuadStateIndex = decoder0.decodeUint32(40);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(48, true);
+      result.checkerboardQuadState = CheckerboardQuadState.decode(decoder1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(56, true);
+      result.debugBorderQuadState = DebugBorderQuadState.decode(decoder1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(64, true);
+      result.ioSurfaceQuadState = IoSurfaceContentQuadState.decode(decoder1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(72, true);
+      result.renderPassQuadState = RenderPassQuadState.decode(decoder1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(80, true);
+      result.solidColorQuadState = SolidColorQuadState.decode(decoder1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(88, true);
+      result.surfaceQuadState = SurfaceQuadState.decode(decoder1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(96, true);
+      result.textureQuadState = TextureQuadState.decode(decoder1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(104, true);
+      result.tileQuadState = TileQuadState.decode(decoder1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(112, true);
+      result.streamVideoQuadState = StreamVideoQuadState.decode(decoder1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(120, true);
+      result.yuvVideoQuadState = YuvVideoQuadState.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeEnum(material, 8);
+    
+    encoder0.encodeBool(needsBlending, 12, 0);
+    
+    encoder0.encodeStruct(rect, 16, false);
+    
+    encoder0.encodeStruct(opaqueRect, 24, false);
+    
+    encoder0.encodeStruct(visibleRect, 32, false);
+    
+    encoder0.encodeUint32(sharedQuadStateIndex, 40);
+    
+    encoder0.encodeStruct(checkerboardQuadState, 48, true);
+    
+    encoder0.encodeStruct(debugBorderQuadState, 56, true);
+    
+    encoder0.encodeStruct(ioSurfaceQuadState, 64, true);
+    
+    encoder0.encodeStruct(renderPassQuadState, 72, true);
+    
+    encoder0.encodeStruct(solidColorQuadState, 80, true);
+    
+    encoder0.encodeStruct(surfaceQuadState, 88, true);
+    
+    encoder0.encodeStruct(textureQuadState, 96, true);
+    
+    encoder0.encodeStruct(tileQuadState, 104, true);
+    
+    encoder0.encodeStruct(streamVideoQuadState, 112, true);
+    
+    encoder0.encodeStruct(yuvVideoQuadState, 120, true);
+  }
+
+  String toString() {
+    return "Quad("
+           "material: $material" ", "
+           "needsBlending: $needsBlending" ", "
+           "rect: $rect" ", "
+           "opaqueRect: $opaqueRect" ", "
+           "visibleRect: $visibleRect" ", "
+           "sharedQuadStateIndex: $sharedQuadStateIndex" ", "
+           "checkerboardQuadState: $checkerboardQuadState" ", "
+           "debugBorderQuadState: $debugBorderQuadState" ", "
+           "ioSurfaceQuadState: $ioSurfaceQuadState" ", "
+           "renderPassQuadState: $renderPassQuadState" ", "
+           "solidColorQuadState: $solidColorQuadState" ", "
+           "surfaceQuadState: $surfaceQuadState" ", "
+           "textureQuadState: $textureQuadState" ", "
+           "tileQuadState: $tileQuadState" ", "
+           "streamVideoQuadState: $streamVideoQuadState" ", "
+           "yuvVideoQuadState: $yuvVideoQuadState" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["material"] = material;
+    map["needsBlending"] = needsBlending;
+    map["rect"] = rect;
+    map["opaqueRect"] = opaqueRect;
+    map["visibleRect"] = visibleRect;
+    map["sharedQuadStateIndex"] = sharedQuadStateIndex;
+    map["checkerboardQuadState"] = checkerboardQuadState;
+    map["debugBorderQuadState"] = debugBorderQuadState;
+    map["ioSurfaceQuadState"] = ioSurfaceQuadState;
+    map["renderPassQuadState"] = renderPassQuadState;
+    map["solidColorQuadState"] = solidColorQuadState;
+    map["surfaceQuadState"] = surfaceQuadState;
+    map["textureQuadState"] = textureQuadState;
+    map["tileQuadState"] = tileQuadState;
+    map["streamVideoQuadState"] = streamVideoQuadState;
+    map["yuvVideoQuadState"] = yuvVideoQuadState;
+    return map;
+  }
+}
+
+
+class SharedQuadState extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(56, 0)
+  ];
+  geometry_mojom.Transform contentToTargetTransform = null;
+  geometry_mojom.Size contentBounds = null;
+  geometry_mojom.Rect visibleContentRect = null;
+  geometry_mojom.Rect clipRect = null;
+  bool isClipped = false;
+  double opacity = 0.0;
+  SkXfermode blendMode = null;
+  int sortingContextId = 0;
+
+  SharedQuadState() : super(kVersions.last.size);
+
+  static SharedQuadState deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static SharedQuadState decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    SharedQuadState result = new SharedQuadState();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, false);
+      result.contentToTargetTransform = geometry_mojom.Transform.decode(decoder1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(16, false);
+      result.contentBounds = geometry_mojom.Size.decode(decoder1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(24, false);
+      result.visibleContentRect = geometry_mojom.Rect.decode(decoder1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(32, false);
+      result.clipRect = geometry_mojom.Rect.decode(decoder1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.isClipped = decoder0.decodeBool(40, 0);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.opacity = decoder0.decodeFloat(44);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+        result.blendMode = SkXfermode.decode(decoder0, 48);
+        if (result.blendMode == null) {
+          throw new bindings.MojoCodecError(
+            'Trying to decode null union for non-nullable SkXfermode.');
+        }
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.sortingContextId = decoder0.decodeInt32(52);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(contentToTargetTransform, 8, false);
+    
+    encoder0.encodeStruct(contentBounds, 16, false);
+    
+    encoder0.encodeStruct(visibleContentRect, 24, false);
+    
+    encoder0.encodeStruct(clipRect, 32, false);
+    
+    encoder0.encodeBool(isClipped, 40, 0);
+    
+    encoder0.encodeFloat(opacity, 44);
+    
+    encoder0.encodeEnum(blendMode, 48);
+    
+    encoder0.encodeInt32(sortingContextId, 52);
+  }
+
+  String toString() {
+    return "SharedQuadState("
+           "contentToTargetTransform: $contentToTargetTransform" ", "
+           "contentBounds: $contentBounds" ", "
+           "visibleContentRect: $visibleContentRect" ", "
+           "clipRect: $clipRect" ", "
+           "isClipped: $isClipped" ", "
+           "opacity: $opacity" ", "
+           "blendMode: $blendMode" ", "
+           "sortingContextId: $sortingContextId" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["contentToTargetTransform"] = contentToTargetTransform;
+    map["contentBounds"] = contentBounds;
+    map["visibleContentRect"] = visibleContentRect;
+    map["clipRect"] = clipRect;
+    map["isClipped"] = isClipped;
+    map["opacity"] = opacity;
+    map["blendMode"] = blendMode;
+    map["sortingContextId"] = sortingContextId;
+    return map;
+  }
+}
+
+
+class Pass extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(56, 0)
+  ];
+  int id = 0;
+  bool hasTransparentBackground = false;
+  geometry_mojom.Rect outputRect = null;
+  geometry_mojom.Rect damageRect = null;
+  geometry_mojom.Transform transformToRootTarget = null;
+  List<Quad> quads = null;
+  List<SharedQuadState> sharedQuadStates = null;
+
+  Pass() : super(kVersions.last.size);
+
+  static Pass deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static Pass decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    Pass result = new Pass();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.id = decoder0.decodeInt32(8);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.hasTransparentBackground = decoder0.decodeBool(12, 0);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(16, false);
+      result.outputRect = geometry_mojom.Rect.decode(decoder1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(24, false);
+      result.damageRect = geometry_mojom.Rect.decode(decoder1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(32, false);
+      result.transformToRootTarget = geometry_mojom.Transform.decode(decoder1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(40, false);
+      {
+        var si1 = decoder1.decodeDataHeaderForPointerArray(bindings.kUnspecifiedArrayLength);
+        result.quads = new List<Quad>(si1.numElements);
+        for (int i1 = 0; i1 < si1.numElements; ++i1) {
+          
+          var decoder2 = decoder1.decodePointer(bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i1, false);
+          result.quads[i1] = Quad.decode(decoder2);
+        }
+      }
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(48, false);
+      {
+        var si1 = decoder1.decodeDataHeaderForPointerArray(bindings.kUnspecifiedArrayLength);
+        result.sharedQuadStates = new List<SharedQuadState>(si1.numElements);
+        for (int i1 = 0; i1 < si1.numElements; ++i1) {
+          
+          var decoder2 = decoder1.decodePointer(bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i1, false);
+          result.sharedQuadStates[i1] = SharedQuadState.decode(decoder2);
+        }
+      }
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeInt32(id, 8);
+    
+    encoder0.encodeBool(hasTransparentBackground, 12, 0);
+    
+    encoder0.encodeStruct(outputRect, 16, false);
+    
+    encoder0.encodeStruct(damageRect, 24, false);
+    
+    encoder0.encodeStruct(transformToRootTarget, 32, false);
+    
+    if (quads == null) {
+      encoder0.encodeNullPointer(40, false);
+    } else {
+      var encoder1 = encoder0.encodePointerArray(quads.length, 40, bindings.kUnspecifiedArrayLength);
+      for (int i0 = 0; i0 < quads.length; ++i0) {
+        
+        encoder1.encodeStruct(quads[i0], bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i0, false);
+      }
+    }
+    
+    if (sharedQuadStates == null) {
+      encoder0.encodeNullPointer(48, false);
+    } else {
+      var encoder1 = encoder0.encodePointerArray(sharedQuadStates.length, 48, bindings.kUnspecifiedArrayLength);
+      for (int i0 = 0; i0 < sharedQuadStates.length; ++i0) {
+        
+        encoder1.encodeStruct(sharedQuadStates[i0], bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i0, false);
+      }
+    }
+  }
+
+  String toString() {
+    return "Pass("
+           "id: $id" ", "
+           "hasTransparentBackground: $hasTransparentBackground" ", "
+           "outputRect: $outputRect" ", "
+           "damageRect: $damageRect" ", "
+           "transformToRootTarget: $transformToRootTarget" ", "
+           "quads: $quads" ", "
+           "sharedQuadStates: $sharedQuadStates" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["id"] = id;
+    map["hasTransparentBackground"] = hasTransparentBackground;
+    map["outputRect"] = outputRect;
+    map["damageRect"] = damageRect;
+    map["transformToRootTarget"] = transformToRootTarget;
+    map["quads"] = quads;
+    map["sharedQuadStates"] = sharedQuadStates;
+    return map;
+  }
+}
+
+
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
new file mode 100644
index 0000000..92cd58c
--- /dev/null
+++ b/mojo/dart/packages/mojo_services/lib/mojo/service_registry.mojom.dart
@@ -0,0 +1,280 @@
+// 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.
+
+library service_registry_mojom;
+
+import 'dart:async';
+
+import 'package:mojo/bindings.dart' as bindings;
+import 'package:mojo/core.dart' as core;
+import 'package:mojo/mojo/service_provider.mojom.dart' as service_provider_mojom;
+
+
+
+class ServiceRegistryAddServicesParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  List<String> interfaceNames = null;
+  Object serviceProvider = null;
+
+  ServiceRegistryAddServicesParams() : super(kVersions.last.size);
+
+  static ServiceRegistryAddServicesParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ServiceRegistryAddServicesParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ServiceRegistryAddServicesParams result = new ServiceRegistryAddServicesParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, false);
+      {
+        var si1 = decoder1.decodeDataHeaderForPointerArray(bindings.kUnspecifiedArrayLength);
+        result.interfaceNames = new List<String>(si1.numElements);
+        for (int i1 = 0; i1 < si1.numElements; ++i1) {
+          
+          result.interfaceNames[i1] = decoder1.decodeString(bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i1, false);
+        }
+      }
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.serviceProvider = decoder0.decodeServiceInterface(16, false, service_provider_mojom.ServiceProviderProxy.newFromEndpoint);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    if (interfaceNames == null) {
+      encoder0.encodeNullPointer(8, false);
+    } else {
+      var encoder1 = encoder0.encodePointerArray(interfaceNames.length, 8, bindings.kUnspecifiedArrayLength);
+      for (int i0 = 0; i0 < interfaceNames.length; ++i0) {
+        
+        encoder1.encodeString(interfaceNames[i0], bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i0, false);
+      }
+    }
+    
+    encoder0.encodeInterface(serviceProvider, 16, false);
+  }
+
+  String toString() {
+    return "ServiceRegistryAddServicesParams("
+           "interfaceNames: $interfaceNames" ", "
+           "serviceProvider: $serviceProvider" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+const int kServiceRegistry_addServices_name = 0;
+
+const String ServiceRegistryName =
+      'mojo::ServiceRegistry';
+
+abstract class ServiceRegistry {
+  void addServices(List<String> interfaceNames, Object serviceProvider);
+
+}
+
+
+class ServiceRegistryProxyImpl extends bindings.Proxy {
+  ServiceRegistryProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  ServiceRegistryProxyImpl.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);
+  }
+
+  String get name => ServiceRegistryName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "ServiceRegistryProxyImpl($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, kServiceRegistry_addServices_name);
+    }
+  
+}
+
+
+class ServiceRegistryProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  ServiceRegistry ptr;
+  final String name = ServiceRegistryName;
+
+  ServiceRegistryProxy(ServiceRegistryProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _ServiceRegistryProxyCalls(proxyImpl);
+
+  ServiceRegistryProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new ServiceRegistryProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _ServiceRegistryProxyCalls(impl);
+  }
+
+  ServiceRegistryProxy.fromHandle(core.MojoHandle handle) :
+      impl = new ServiceRegistryProxyImpl.fromHandle(handle) {
+    ptr = new _ServiceRegistryProxyCalls(impl);
+  }
+
+  ServiceRegistryProxy.unbound() :
+      impl = new ServiceRegistryProxyImpl.unbound() {
+    ptr = new _ServiceRegistryProxyCalls(impl);
+  }
+
+  factory ServiceRegistryProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    ServiceRegistryProxy p = new ServiceRegistryProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static ServiceRegistryProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ServiceRegistryProxy"));
+    return new ServiceRegistryProxy.fromEndpoint(endpoint);
+  }
+
+  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)";
+  }
+}
+
+
+class ServiceRegistryStub extends bindings.Stub {
+  ServiceRegistry _impl = null;
+
+  ServiceRegistryStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  ServiceRegistryStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  ServiceRegistryStub.unbound() : super.unbound();
+
+  static ServiceRegistryStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ServiceRegistryStub"));
+    return new ServiceRegistryStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = ServiceRegistryName;
+
+
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      case kServiceRegistry_addServices_name:
+        var params = ServiceRegistryAddServicesParams.deserialize(
+            message.payload);
+        _impl.addServices(params.interfaceNames, params.serviceProvider);
+        break;
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  ServiceRegistry get impl => _impl;
+  set impl(ServiceRegistry d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "ServiceRegistryStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/sharing.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/sharing.mojom.dart
new file mode 100644
index 0000000..f4e4686
--- /dev/null
+++ b/mojo/dart/packages/mojo_services/lib/mojo/sharing.mojom.dart
@@ -0,0 +1,255 @@
+// 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.
+
+library sharing_mojom;
+
+import 'dart:async';
+
+import 'package:mojo/bindings.dart' as bindings;
+import 'package:mojo/core.dart' as core;
+
+
+
+class SharingServiceShareTextParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  String text = null;
+
+  SharingServiceShareTextParams() : super(kVersions.last.size);
+
+  static SharingServiceShareTextParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static SharingServiceShareTextParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    SharingServiceShareTextParams result = new SharingServiceShareTextParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.text = decoder0.decodeString(8, false);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeString(text, 8, false);
+  }
+
+  String toString() {
+    return "SharingServiceShareTextParams("
+           "text: $text" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["text"] = text;
+    return map;
+  }
+}
+
+const int kSharingService_shareText_name = 0;
+
+const String SharingServiceName =
+      'mojo::SharingService';
+
+abstract class SharingService {
+  void shareText(String text);
+
+}
+
+
+class SharingServiceProxyImpl extends bindings.Proxy {
+  SharingServiceProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  SharingServiceProxyImpl.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);
+  }
+
+  String get name => SharingServiceName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "SharingServiceProxyImpl($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, kSharingService_shareText_name);
+    }
+  
+}
+
+
+class SharingServiceProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  SharingService ptr;
+  final String name = SharingServiceName;
+
+  SharingServiceProxy(SharingServiceProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _SharingServiceProxyCalls(proxyImpl);
+
+  SharingServiceProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new SharingServiceProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _SharingServiceProxyCalls(impl);
+  }
+
+  SharingServiceProxy.fromHandle(core.MojoHandle handle) :
+      impl = new SharingServiceProxyImpl.fromHandle(handle) {
+    ptr = new _SharingServiceProxyCalls(impl);
+  }
+
+  SharingServiceProxy.unbound() :
+      impl = new SharingServiceProxyImpl.unbound() {
+    ptr = new _SharingServiceProxyCalls(impl);
+  }
+
+  factory SharingServiceProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    SharingServiceProxy p = new SharingServiceProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static SharingServiceProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For SharingServiceProxy"));
+    return new SharingServiceProxy.fromEndpoint(endpoint);
+  }
+
+  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)";
+  }
+}
+
+
+class SharingServiceStub extends bindings.Stub {
+  SharingService _impl = null;
+
+  SharingServiceStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  SharingServiceStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  SharingServiceStub.unbound() : super.unbound();
+
+  static SharingServiceStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For SharingServiceStub"));
+    return new SharingServiceStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = SharingServiceName;
+
+
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      case kSharingService_shareText_name:
+        var params = SharingServiceShareTextParams.deserialize(
+            message.payload);
+        _impl.shareText(params.text);
+        break;
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  SharingService get impl => _impl;
+  set impl(SharingService d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "SharingServiceStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/surface_id.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/surface_id.mojom.dart
new file mode 100644
index 0000000..05d9a90
--- /dev/null
+++ b/mojo/dart/packages/mojo_services/lib/mojo/surface_id.mojom.dart
@@ -0,0 +1,89 @@
+// 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.
+
+library surface_id_mojom;
+
+import 'dart:async';
+
+import 'package:mojo/bindings.dart' as bindings;
+import 'package:mojo/core.dart' as core;
+
+
+
+class SurfaceId extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  int local = 0;
+  int idNamespace = 0;
+
+  SurfaceId() : super(kVersions.last.size);
+
+  static SurfaceId deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static SurfaceId decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    SurfaceId result = new SurfaceId();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.local = decoder0.decodeUint32(8);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.idNamespace = decoder0.decodeUint32(12);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeUint32(local, 8);
+    
+    encoder0.encodeUint32(idNamespace, 12);
+  }
+
+  String toString() {
+    return "SurfaceId("
+           "local: $local" ", "
+           "idNamespace: $idNamespace" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["local"] = local;
+    map["idNamespace"] = idNamespace;
+    return map;
+  }
+}
+
+
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/surfaces.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/surfaces.mojom.dart
new file mode 100644
index 0000000..4fd551a
--- /dev/null
+++ b/mojo/dart/packages/mojo_services/lib/mojo/surfaces.mojom.dart
@@ -0,0 +1,1627 @@
+// 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.
+
+library surfaces_mojom;
+
+import 'dart:async';
+
+import 'package:mojo/bindings.dart' as bindings;
+import 'package:mojo/core.dart' as core;
+import 'package:mojo_services/mojo/geometry.mojom.dart' as geometry_mojom;
+import 'package:mojo_services/mojo/quads.mojom.dart' as quads_mojom;
+import 'package:mojo_services/mojo/surface_id.mojom.dart' as surface_id_mojom;
+class ResourceFormat extends bindings.MojoEnum {
+  static const RGBA_8888 = const ResourceFormat._(0);
+  static const RGBA_4444 = const ResourceFormat._(1);
+  static const BGRA_8888 = const ResourceFormat._(2);
+  static const ALPHA_8 = const ResourceFormat._(3);
+  static const LUMINANCE_8 = const ResourceFormat._(4);
+  static const RGB_565 = const ResourceFormat._(5);
+  static const ETC1 = const ResourceFormat._(6);
+
+  const ResourceFormat._(int v) : super(v);
+
+  static const Map<String, ResourceFormat> valuesMap = const {
+    "RGBA_8888": RGBA_8888,
+    "RGBA_4444": RGBA_4444,
+    "BGRA_8888": BGRA_8888,
+    "ALPHA_8": ALPHA_8,
+    "LUMINANCE_8": LUMINANCE_8,
+    "RGB_565": RGB_565,
+    "ETC1": ETC1,
+  };
+  static const List<ResourceFormat> values = const [
+    RGBA_8888,
+    RGBA_4444,
+    BGRA_8888,
+    ALPHA_8,
+    LUMINANCE_8,
+    RGB_565,
+    ETC1,
+  ];
+
+  static ResourceFormat valueOf(String name) => valuesMap[name];
+
+  factory ResourceFormat(int v) {
+    switch (v) {
+      case 0:
+        return RGBA_8888;
+      case 1:
+        return RGBA_4444;
+      case 2:
+        return BGRA_8888;
+      case 3:
+        return ALPHA_8;
+      case 4:
+        return LUMINANCE_8;
+      case 5:
+        return RGB_565;
+      case 6:
+        return ETC1;
+      default:
+        return null;
+    }
+  }
+
+  static ResourceFormat decode(bindings.Decoder decoder0, int offset) {
+    int v = decoder0.decodeUint32(offset);
+    ResourceFormat result = new ResourceFormat(v);
+    if (result == null) {
+      throw new bindings.MojoCodecError(
+          'Bad value $v for enum ResourceFormat.');
+    }
+    return result;
+  }
+
+  String toString() {
+    switch(this) {
+      case RGBA_8888:
+        return 'ResourceFormat.RGBA_8888';
+      case RGBA_4444:
+        return 'ResourceFormat.RGBA_4444';
+      case BGRA_8888:
+        return 'ResourceFormat.BGRA_8888';
+      case ALPHA_8:
+        return 'ResourceFormat.ALPHA_8';
+      case LUMINANCE_8:
+        return 'ResourceFormat.LUMINANCE_8';
+      case RGB_565:
+        return 'ResourceFormat.RGB_565';
+      case ETC1:
+        return 'ResourceFormat.ETC1';
+    }
+  }
+
+  int toJson() => value;
+}
+
+
+
+class Mailbox extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  List<int> name = null;
+
+  Mailbox() : super(kVersions.last.size);
+
+  static Mailbox deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static Mailbox decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    Mailbox result = new Mailbox();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.name = decoder0.decodeInt8Array(8, bindings.kNothingNullable, 64);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeInt8Array(name, 8, bindings.kNothingNullable, 64);
+  }
+
+  String toString() {
+    return "Mailbox("
+           "name: $name" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["name"] = name;
+    return map;
+  }
+}
+
+
+class MailboxHolder extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  Mailbox mailbox = null;
+  int textureTarget = 0;
+  int syncPoint = 0;
+
+  MailboxHolder() : super(kVersions.last.size);
+
+  static MailboxHolder deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static MailboxHolder decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    MailboxHolder result = new MailboxHolder();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, false);
+      result.mailbox = Mailbox.decode(decoder1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.textureTarget = decoder0.decodeUint32(16);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.syncPoint = decoder0.decodeUint32(20);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(mailbox, 8, false);
+    
+    encoder0.encodeUint32(textureTarget, 16);
+    
+    encoder0.encodeUint32(syncPoint, 20);
+  }
+
+  String toString() {
+    return "MailboxHolder("
+           "mailbox: $mailbox" ", "
+           "textureTarget: $textureTarget" ", "
+           "syncPoint: $syncPoint" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["mailbox"] = mailbox;
+    map["textureTarget"] = textureTarget;
+    map["syncPoint"] = syncPoint;
+    return map;
+  }
+}
+
+
+class TransferableResource extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(40, 0)
+  ];
+  int id = 0;
+  ResourceFormat format = null;
+  int filter = 0;
+  bool isRepeated = false;
+  bool isSoftware = false;
+  geometry_mojom.Size size = null;
+  MailboxHolder mailboxHolder = null;
+
+  TransferableResource() : super(kVersions.last.size);
+
+  static TransferableResource deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static TransferableResource decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    TransferableResource result = new TransferableResource();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.id = decoder0.decodeUint32(8);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+        result.format = ResourceFormat.decode(decoder0, 12);
+        if (result.format == null) {
+          throw new bindings.MojoCodecError(
+            'Trying to decode null union for non-nullable ResourceFormat.');
+        }
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.filter = decoder0.decodeUint32(16);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.isRepeated = decoder0.decodeBool(20, 0);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.isSoftware = decoder0.decodeBool(20, 1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(24, false);
+      result.size = geometry_mojom.Size.decode(decoder1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(32, false);
+      result.mailboxHolder = MailboxHolder.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeUint32(id, 8);
+    
+    encoder0.encodeEnum(format, 12);
+    
+    encoder0.encodeUint32(filter, 16);
+    
+    encoder0.encodeBool(isRepeated, 20, 0);
+    
+    encoder0.encodeBool(isSoftware, 20, 1);
+    
+    encoder0.encodeStruct(size, 24, false);
+    
+    encoder0.encodeStruct(mailboxHolder, 32, false);
+  }
+
+  String toString() {
+    return "TransferableResource("
+           "id: $id" ", "
+           "format: $format" ", "
+           "filter: $filter" ", "
+           "isRepeated: $isRepeated" ", "
+           "isSoftware: $isSoftware" ", "
+           "size: $size" ", "
+           "mailboxHolder: $mailboxHolder" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["id"] = id;
+    map["format"] = format;
+    map["filter"] = filter;
+    map["isRepeated"] = isRepeated;
+    map["isSoftware"] = isSoftware;
+    map["size"] = size;
+    map["mailboxHolder"] = mailboxHolder;
+    return map;
+  }
+}
+
+
+class ReturnedResource extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  int id = 0;
+  int syncPoint = 0;
+  int count = 0;
+  bool lost = false;
+
+  ReturnedResource() : super(kVersions.last.size);
+
+  static ReturnedResource deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ReturnedResource decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ReturnedResource result = new ReturnedResource();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.id = decoder0.decodeUint32(8);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.syncPoint = decoder0.decodeUint32(12);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.count = decoder0.decodeInt32(16);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.lost = decoder0.decodeBool(20, 0);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeUint32(id, 8);
+    
+    encoder0.encodeUint32(syncPoint, 12);
+    
+    encoder0.encodeInt32(count, 16);
+    
+    encoder0.encodeBool(lost, 20, 0);
+  }
+
+  String toString() {
+    return "ReturnedResource("
+           "id: $id" ", "
+           "syncPoint: $syncPoint" ", "
+           "count: $count" ", "
+           "lost: $lost" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["id"] = id;
+    map["syncPoint"] = syncPoint;
+    map["count"] = count;
+    map["lost"] = lost;
+    return map;
+  }
+}
+
+
+class Frame extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  List<TransferableResource> resources = null;
+  List<quads_mojom.Pass> passes = null;
+
+  Frame() : super(kVersions.last.size);
+
+  static Frame deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static Frame decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    Frame result = new Frame();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, false);
+      {
+        var si1 = decoder1.decodeDataHeaderForPointerArray(bindings.kUnspecifiedArrayLength);
+        result.resources = new List<TransferableResource>(si1.numElements);
+        for (int i1 = 0; i1 < si1.numElements; ++i1) {
+          
+          var decoder2 = decoder1.decodePointer(bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i1, false);
+          result.resources[i1] = TransferableResource.decode(decoder2);
+        }
+      }
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(16, false);
+      {
+        var si1 = decoder1.decodeDataHeaderForPointerArray(bindings.kUnspecifiedArrayLength);
+        result.passes = new List<quads_mojom.Pass>(si1.numElements);
+        for (int i1 = 0; i1 < si1.numElements; ++i1) {
+          
+          var decoder2 = decoder1.decodePointer(bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i1, false);
+          result.passes[i1] = quads_mojom.Pass.decode(decoder2);
+        }
+      }
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    if (resources == null) {
+      encoder0.encodeNullPointer(8, false);
+    } else {
+      var encoder1 = encoder0.encodePointerArray(resources.length, 8, bindings.kUnspecifiedArrayLength);
+      for (int i0 = 0; i0 < resources.length; ++i0) {
+        
+        encoder1.encodeStruct(resources[i0], bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i0, false);
+      }
+    }
+    
+    if (passes == null) {
+      encoder0.encodeNullPointer(16, false);
+    } else {
+      var encoder1 = encoder0.encodePointerArray(passes.length, 16, bindings.kUnspecifiedArrayLength);
+      for (int i0 = 0; i0 < passes.length; ++i0) {
+        
+        encoder1.encodeStruct(passes[i0], bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i0, false);
+      }
+    }
+  }
+
+  String toString() {
+    return "Frame("
+           "resources: $resources" ", "
+           "passes: $passes" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["resources"] = resources;
+    map["passes"] = passes;
+    return map;
+  }
+}
+
+
+class ResourceReturnerReturnResourcesParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  List<ReturnedResource> resources = null;
+
+  ResourceReturnerReturnResourcesParams() : super(kVersions.last.size);
+
+  static ResourceReturnerReturnResourcesParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ResourceReturnerReturnResourcesParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ResourceReturnerReturnResourcesParams result = new ResourceReturnerReturnResourcesParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, false);
+      {
+        var si1 = decoder1.decodeDataHeaderForPointerArray(bindings.kUnspecifiedArrayLength);
+        result.resources = new List<ReturnedResource>(si1.numElements);
+        for (int i1 = 0; i1 < si1.numElements; ++i1) {
+          
+          var decoder2 = decoder1.decodePointer(bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i1, false);
+          result.resources[i1] = ReturnedResource.decode(decoder2);
+        }
+      }
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    if (resources == null) {
+      encoder0.encodeNullPointer(8, false);
+    } else {
+      var encoder1 = encoder0.encodePointerArray(resources.length, 8, bindings.kUnspecifiedArrayLength);
+      for (int i0 = 0; i0 < resources.length; ++i0) {
+        
+        encoder1.encodeStruct(resources[i0], bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i0, false);
+      }
+    }
+  }
+
+  String toString() {
+    return "ResourceReturnerReturnResourcesParams("
+           "resources: $resources" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["resources"] = resources;
+    return map;
+  }
+}
+
+
+class SurfaceGetIdNamespaceParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(8, 0)
+  ];
+
+  SurfaceGetIdNamespaceParams() : super(kVersions.last.size);
+
+  static SurfaceGetIdNamespaceParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static SurfaceGetIdNamespaceParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    SurfaceGetIdNamespaceParams result = new SurfaceGetIdNamespaceParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    encoder.getStructEncoderAtOffset(kVersions.last);
+  }
+
+  String toString() {
+    return "SurfaceGetIdNamespaceParams("")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    return map;
+  }
+}
+
+
+class SurfaceGetIdNamespaceResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  int idNamespace = 0;
+
+  SurfaceGetIdNamespaceResponseParams() : super(kVersions.last.size);
+
+  static SurfaceGetIdNamespaceResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static SurfaceGetIdNamespaceResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    SurfaceGetIdNamespaceResponseParams result = new SurfaceGetIdNamespaceResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.idNamespace = decoder0.decodeUint32(8);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeUint32(idNamespace, 8);
+  }
+
+  String toString() {
+    return "SurfaceGetIdNamespaceResponseParams("
+           "idNamespace: $idNamespace" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["idNamespace"] = idNamespace;
+    return map;
+  }
+}
+
+
+class SurfaceSetResourceReturnerParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  Object returner = null;
+
+  SurfaceSetResourceReturnerParams() : super(kVersions.last.size);
+
+  static SurfaceSetResourceReturnerParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static SurfaceSetResourceReturnerParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    SurfaceSetResourceReturnerParams result = new SurfaceSetResourceReturnerParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.returner = decoder0.decodeServiceInterface(8, false, ResourceReturnerProxy.newFromEndpoint);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeInterface(returner, 8, false);
+  }
+
+  String toString() {
+    return "SurfaceSetResourceReturnerParams("
+           "returner: $returner" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+
+class SurfaceCreateSurfaceParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  int idLocal = 0;
+
+  SurfaceCreateSurfaceParams() : super(kVersions.last.size);
+
+  static SurfaceCreateSurfaceParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static SurfaceCreateSurfaceParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    SurfaceCreateSurfaceParams result = new SurfaceCreateSurfaceParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.idLocal = decoder0.decodeUint32(8);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeUint32(idLocal, 8);
+  }
+
+  String toString() {
+    return "SurfaceCreateSurfaceParams("
+           "idLocal: $idLocal" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["idLocal"] = idLocal;
+    return map;
+  }
+}
+
+
+class SurfaceSubmitFrameParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  int idLocal = 0;
+  Frame frame = null;
+
+  SurfaceSubmitFrameParams() : super(kVersions.last.size);
+
+  static SurfaceSubmitFrameParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static SurfaceSubmitFrameParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    SurfaceSubmitFrameParams result = new SurfaceSubmitFrameParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.idLocal = decoder0.decodeUint32(8);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(16, false);
+      result.frame = Frame.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeUint32(idLocal, 8);
+    
+    encoder0.encodeStruct(frame, 16, false);
+  }
+
+  String toString() {
+    return "SurfaceSubmitFrameParams("
+           "idLocal: $idLocal" ", "
+           "frame: $frame" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["idLocal"] = idLocal;
+    map["frame"] = frame;
+    return map;
+  }
+}
+
+
+class SurfaceSubmitFrameResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(8, 0)
+  ];
+
+  SurfaceSubmitFrameResponseParams() : super(kVersions.last.size);
+
+  static SurfaceSubmitFrameResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static SurfaceSubmitFrameResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    SurfaceSubmitFrameResponseParams result = new SurfaceSubmitFrameResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    encoder.getStructEncoderAtOffset(kVersions.last);
+  }
+
+  String toString() {
+    return "SurfaceSubmitFrameResponseParams("")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    return map;
+  }
+}
+
+
+class SurfaceDestroySurfaceParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  int idLocal = 0;
+
+  SurfaceDestroySurfaceParams() : super(kVersions.last.size);
+
+  static SurfaceDestroySurfaceParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static SurfaceDestroySurfaceParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    SurfaceDestroySurfaceParams result = new SurfaceDestroySurfaceParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.idLocal = decoder0.decodeUint32(8);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeUint32(idLocal, 8);
+  }
+
+  String toString() {
+    return "SurfaceDestroySurfaceParams("
+           "idLocal: $idLocal" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["idLocal"] = idLocal;
+    return map;
+  }
+}
+
+const int kResourceReturner_returnResources_name = 0;
+
+const String ResourceReturnerName =
+      'mojo::ResourceReturner';
+
+abstract class ResourceReturner {
+  void returnResources(List<ReturnedResource> resources);
+
+}
+
+
+class ResourceReturnerProxyImpl extends bindings.Proxy {
+  ResourceReturnerProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  ResourceReturnerProxyImpl.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);
+  }
+
+  String get name => ResourceReturnerName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "ResourceReturnerProxyImpl($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, kResourceReturner_returnResources_name);
+    }
+  
+}
+
+
+class ResourceReturnerProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  ResourceReturner ptr;
+  final String name = ResourceReturnerName;
+
+  ResourceReturnerProxy(ResourceReturnerProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _ResourceReturnerProxyCalls(proxyImpl);
+
+  ResourceReturnerProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new ResourceReturnerProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _ResourceReturnerProxyCalls(impl);
+  }
+
+  ResourceReturnerProxy.fromHandle(core.MojoHandle handle) :
+      impl = new ResourceReturnerProxyImpl.fromHandle(handle) {
+    ptr = new _ResourceReturnerProxyCalls(impl);
+  }
+
+  ResourceReturnerProxy.unbound() :
+      impl = new ResourceReturnerProxyImpl.unbound() {
+    ptr = new _ResourceReturnerProxyCalls(impl);
+  }
+
+  factory ResourceReturnerProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    ResourceReturnerProxy p = new ResourceReturnerProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static ResourceReturnerProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ResourceReturnerProxy"));
+    return new ResourceReturnerProxy.fromEndpoint(endpoint);
+  }
+
+  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)";
+  }
+}
+
+
+class ResourceReturnerStub extends bindings.Stub {
+  ResourceReturner _impl = null;
+
+  ResourceReturnerStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  ResourceReturnerStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  ResourceReturnerStub.unbound() : super.unbound();
+
+  static ResourceReturnerStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ResourceReturnerStub"));
+    return new ResourceReturnerStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = ResourceReturnerName;
+
+
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      case kResourceReturner_returnResources_name:
+        var params = ResourceReturnerReturnResourcesParams.deserialize(
+            message.payload);
+        _impl.returnResources(params.resources);
+        break;
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  ResourceReturner get impl => _impl;
+  set impl(ResourceReturner d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "ResourceReturnerStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+const int kSurface_getIdNamespace_name = 0;
+const int kSurface_setResourceReturner_name = 1;
+const int kSurface_createSurface_name = 2;
+const int kSurface_submitFrame_name = 3;
+const int kSurface_destroySurface_name = 4;
+
+const String SurfaceName =
+      'mojo::Surface';
+
+abstract class Surface {
+  dynamic getIdNamespace([Function responseFactory = null]);
+  void setResourceReturner(Object returner);
+  void createSurface(int idLocal);
+  dynamic submitFrame(int idLocal,Frame frame,[Function responseFactory = null]);
+  void destroySurface(int idLocal);
+
+}
+
+
+class SurfaceProxyImpl extends bindings.Proxy {
+  SurfaceProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  SurfaceProxyImpl.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);
+  }
+
+  String get name => SurfaceName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      case kSurface_getIdNamespace_name:
+        var r = SurfaceGetIdNamespaceResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      case kSurface_submitFrame_name:
+        var r = SurfaceSubmitFrameResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "SurfaceProxyImpl($superString)";
+  }
+}
+
+
+class _SurfaceProxyCalls implements Surface {
+  SurfaceProxyImpl _proxyImpl;
+
+  _SurfaceProxyCalls(this._proxyImpl);
+    dynamic getIdNamespace([Function responseFactory = null]) {
+      var params = new SurfaceGetIdNamespaceParams();
+      return _proxyImpl.sendMessageWithRequestId(
+          params,
+          kSurface_getIdNamespace_name,
+          -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, kSurface_setResourceReturner_name);
+    }
+  
+    void createSurface(int idLocal) {
+      if (!_proxyImpl.isBound) {
+        _proxyImpl.proxyError("The Proxy is closed.");
+        return;
+      }
+      var params = new SurfaceCreateSurfaceParams();
+      params.idLocal = idLocal;
+      _proxyImpl.sendMessage(params, kSurface_createSurface_name);
+    }
+  
+    dynamic submitFrame(int idLocal,Frame frame,[Function responseFactory = null]) {
+      var params = new SurfaceSubmitFrameParams();
+      params.idLocal = idLocal;
+      params.frame = frame;
+      return _proxyImpl.sendMessageWithRequestId(
+          params,
+          kSurface_submitFrame_name,
+          -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, kSurface_destroySurface_name);
+    }
+  
+}
+
+
+class SurfaceProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  Surface ptr;
+  final String name = SurfaceName;
+
+  SurfaceProxy(SurfaceProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _SurfaceProxyCalls(proxyImpl);
+
+  SurfaceProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new SurfaceProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _SurfaceProxyCalls(impl);
+  }
+
+  SurfaceProxy.fromHandle(core.MojoHandle handle) :
+      impl = new SurfaceProxyImpl.fromHandle(handle) {
+    ptr = new _SurfaceProxyCalls(impl);
+  }
+
+  SurfaceProxy.unbound() :
+      impl = new SurfaceProxyImpl.unbound() {
+    ptr = new _SurfaceProxyCalls(impl);
+  }
+
+  factory SurfaceProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    SurfaceProxy p = new SurfaceProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static SurfaceProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For SurfaceProxy"));
+    return new SurfaceProxy.fromEndpoint(endpoint);
+  }
+
+  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 "SurfaceProxy($impl)";
+  }
+}
+
+
+class SurfaceStub extends bindings.Stub {
+  Surface _impl = null;
+
+  SurfaceStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  SurfaceStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  SurfaceStub.unbound() : super.unbound();
+
+  static SurfaceStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For SurfaceStub"));
+    return new SurfaceStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = SurfaceName;
+
+
+  SurfaceGetIdNamespaceResponseParams _SurfaceGetIdNamespaceResponseParamsFactory(int idNamespace) {
+    var result = new SurfaceGetIdNamespaceResponseParams();
+    result.idNamespace = idNamespace;
+    return result;
+  }
+  SurfaceSubmitFrameResponseParams _SurfaceSubmitFrameResponseParamsFactory() {
+    var result = new SurfaceSubmitFrameResponseParams();
+    return result;
+  }
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      case kSurface_getIdNamespace_name:
+        var params = SurfaceGetIdNamespaceParams.deserialize(
+            message.payload);
+        var response = _impl.getIdNamespace(_SurfaceGetIdNamespaceResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kSurface_getIdNamespace_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kSurface_getIdNamespace_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      case kSurface_setResourceReturner_name:
+        var params = SurfaceSetResourceReturnerParams.deserialize(
+            message.payload);
+        _impl.setResourceReturner(params.returner);
+        break;
+      case kSurface_createSurface_name:
+        var params = SurfaceCreateSurfaceParams.deserialize(
+            message.payload);
+        _impl.createSurface(params.idLocal);
+        break;
+      case kSurface_submitFrame_name:
+        var params = SurfaceSubmitFrameParams.deserialize(
+            message.payload);
+        var response = _impl.submitFrame(params.idLocal,params.frame,_SurfaceSubmitFrameResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kSurface_submitFrame_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kSurface_submitFrame_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      case kSurface_destroySurface_name:
+        var params = SurfaceDestroySurfaceParams.deserialize(
+            message.payload);
+        _impl.destroySurface(params.idLocal);
+        break;
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  Surface get impl => _impl;
+  set impl(Surface d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "SurfaceStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+
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
new file mode 100644
index 0000000..3d46fc9
--- /dev/null
+++ b/mojo/dart/packages/mojo_services/lib/mojo/tcp_bound_socket.mojom.dart
@@ -0,0 +1,587 @@
+// 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.
+
+library tcp_bound_socket_mojom;
+
+import 'dart:async';
+
+import 'package:mojo/bindings.dart' as bindings;
+import 'package:mojo/core.dart' as core;
+import 'package:mojo/mojo/network_error.mojom.dart' as network_error_mojom;
+import 'package:mojo_services/mojo/net_address.mojom.dart' as net_address_mojom;
+import 'package:mojo_services/mojo/tcp_connected_socket.mojom.dart' as tcp_connected_socket_mojom;
+import 'package:mojo_services/mojo/tcp_server_socket.mojom.dart' as tcp_server_socket_mojom;
+
+
+
+class TcpBoundSocketStartListeningParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  Object server = null;
+
+  TcpBoundSocketStartListeningParams() : super(kVersions.last.size);
+
+  static TcpBoundSocketStartListeningParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static TcpBoundSocketStartListeningParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    TcpBoundSocketStartListeningParams result = new TcpBoundSocketStartListeningParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.server = decoder0.decodeInterfaceRequest(8, false, tcp_server_socket_mojom.TcpServerSocketStub.newFromEndpoint);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeInterfaceRequest(server, 8, false);
+  }
+
+  String toString() {
+    return "TcpBoundSocketStartListeningParams("
+           "server: $server" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+
+class TcpBoundSocketStartListeningResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  network_error_mojom.NetworkError result = null;
+
+  TcpBoundSocketStartListeningResponseParams() : super(kVersions.last.size);
+
+  static TcpBoundSocketStartListeningResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static TcpBoundSocketStartListeningResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    TcpBoundSocketStartListeningResponseParams result = new TcpBoundSocketStartListeningResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, false);
+      result.result = network_error_mojom.NetworkError.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(result, 8, false);
+  }
+
+  String toString() {
+    return "TcpBoundSocketStartListeningResponseParams("
+           "result: $result" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["result"] = result;
+    return map;
+  }
+}
+
+
+class TcpBoundSocketConnectParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(32, 0)
+  ];
+  net_address_mojom.NetAddress remoteAddress = null;
+  core.MojoDataPipeConsumer sendStream = null;
+  core.MojoDataPipeProducer receiveStream = null;
+  Object clientSocket = null;
+
+  TcpBoundSocketConnectParams() : super(kVersions.last.size);
+
+  static TcpBoundSocketConnectParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static TcpBoundSocketConnectParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    TcpBoundSocketConnectParams result = new TcpBoundSocketConnectParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, false);
+      result.remoteAddress = net_address_mojom.NetAddress.decode(decoder1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.sendStream = decoder0.decodeConsumerHandle(16, false);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.receiveStream = decoder0.decodeProducerHandle(20, false);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.clientSocket = decoder0.decodeInterfaceRequest(24, false, tcp_connected_socket_mojom.TcpConnectedSocketStub.newFromEndpoint);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(remoteAddress, 8, false);
+    
+    encoder0.encodeConsumerHandle(sendStream, 16, false);
+    
+    encoder0.encodeProducerHandle(receiveStream, 20, false);
+    
+    encoder0.encodeInterfaceRequest(clientSocket, 24, false);
+  }
+
+  String toString() {
+    return "TcpBoundSocketConnectParams("
+           "remoteAddress: $remoteAddress" ", "
+           "sendStream: $sendStream" ", "
+           "receiveStream: $receiveStream" ", "
+           "clientSocket: $clientSocket" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+
+class TcpBoundSocketConnectResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  network_error_mojom.NetworkError result = null;
+
+  TcpBoundSocketConnectResponseParams() : super(kVersions.last.size);
+
+  static TcpBoundSocketConnectResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static TcpBoundSocketConnectResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    TcpBoundSocketConnectResponseParams result = new TcpBoundSocketConnectResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, false);
+      result.result = network_error_mojom.NetworkError.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(result, 8, false);
+  }
+
+  String toString() {
+    return "TcpBoundSocketConnectResponseParams("
+           "result: $result" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["result"] = result;
+    return map;
+  }
+}
+
+const int kTcpBoundSocket_startListening_name = 0;
+const int kTcpBoundSocket_connect_name = 1;
+
+const String TcpBoundSocketName =
+      'mojo::TCPBoundSocket';
+
+abstract class TcpBoundSocket {
+  dynamic startListening(Object server,[Function responseFactory = null]);
+  dynamic connect(net_address_mojom.NetAddress remoteAddress,core.MojoDataPipeConsumer sendStream,core.MojoDataPipeProducer receiveStream,Object clientSocket,[Function responseFactory = null]);
+
+}
+
+
+class TcpBoundSocketProxyImpl extends bindings.Proxy {
+  TcpBoundSocketProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  TcpBoundSocketProxyImpl.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);
+  }
+
+  String get name => TcpBoundSocketName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      case kTcpBoundSocket_startListening_name:
+        var r = TcpBoundSocketStartListeningResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      case kTcpBoundSocket_connect_name:
+        var r = TcpBoundSocketConnectResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "TcpBoundSocketProxyImpl($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,
+          kTcpBoundSocket_startListening_name,
+          -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,
+          kTcpBoundSocket_connect_name,
+          -1,
+          bindings.MessageHeader.kMessageExpectsResponse);
+    }
+}
+
+
+class TcpBoundSocketProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  TcpBoundSocket ptr;
+  final String name = TcpBoundSocketName;
+
+  TcpBoundSocketProxy(TcpBoundSocketProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _TcpBoundSocketProxyCalls(proxyImpl);
+
+  TcpBoundSocketProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new TcpBoundSocketProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _TcpBoundSocketProxyCalls(impl);
+  }
+
+  TcpBoundSocketProxy.fromHandle(core.MojoHandle handle) :
+      impl = new TcpBoundSocketProxyImpl.fromHandle(handle) {
+    ptr = new _TcpBoundSocketProxyCalls(impl);
+  }
+
+  TcpBoundSocketProxy.unbound() :
+      impl = new TcpBoundSocketProxyImpl.unbound() {
+    ptr = new _TcpBoundSocketProxyCalls(impl);
+  }
+
+  factory TcpBoundSocketProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    TcpBoundSocketProxy p = new TcpBoundSocketProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static TcpBoundSocketProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For TcpBoundSocketProxy"));
+    return new TcpBoundSocketProxy.fromEndpoint(endpoint);
+  }
+
+  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)";
+  }
+}
+
+
+class TcpBoundSocketStub extends bindings.Stub {
+  TcpBoundSocket _impl = null;
+
+  TcpBoundSocketStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  TcpBoundSocketStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  TcpBoundSocketStub.unbound() : super.unbound();
+
+  static TcpBoundSocketStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For TcpBoundSocketStub"));
+    return new TcpBoundSocketStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = TcpBoundSocketName;
+
+
+  TcpBoundSocketStartListeningResponseParams _TcpBoundSocketStartListeningResponseParamsFactory(network_error_mojom.NetworkError result) {
+    var result = new TcpBoundSocketStartListeningResponseParams();
+    result.result = result;
+    return result;
+  }
+  TcpBoundSocketConnectResponseParams _TcpBoundSocketConnectResponseParamsFactory(network_error_mojom.NetworkError result) {
+    var result = new TcpBoundSocketConnectResponseParams();
+    result.result = result;
+    return result;
+  }
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      case kTcpBoundSocket_startListening_name:
+        var params = TcpBoundSocketStartListeningParams.deserialize(
+            message.payload);
+        var response = _impl.startListening(params.server,_TcpBoundSocketStartListeningResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kTcpBoundSocket_startListening_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kTcpBoundSocket_startListening_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      case kTcpBoundSocket_connect_name:
+        var params = TcpBoundSocketConnectParams.deserialize(
+            message.payload);
+        var response = _impl.connect(params.remoteAddress,params.sendStream,params.receiveStream,params.clientSocket,_TcpBoundSocketConnectResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kTcpBoundSocket_connect_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kTcpBoundSocket_connect_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  TcpBoundSocket get impl => _impl;
+  set impl(TcpBoundSocket d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "TcpBoundSocketStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+
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
new file mode 100644
index 0000000..a13a3a5
--- /dev/null
+++ b/mojo/dart/packages/mojo_services/lib/mojo/tcp_connected_socket.mojom.dart
@@ -0,0 +1,171 @@
+// 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.
+
+library tcp_connected_socket_mojom;
+
+import 'dart:async';
+
+import 'package:mojo/bindings.dart' as bindings;
+import 'package:mojo/core.dart' as core;
+
+
+
+const String TcpConnectedSocketName =
+      'mojo::TCPConnectedSocket';
+
+abstract class TcpConnectedSocket {
+
+}
+
+
+class TcpConnectedSocketProxyImpl extends bindings.Proxy {
+  TcpConnectedSocketProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  TcpConnectedSocketProxyImpl.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);
+  }
+
+  String get name => TcpConnectedSocketName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "TcpConnectedSocketProxyImpl($superString)";
+  }
+}
+
+
+class _TcpConnectedSocketProxyCalls implements TcpConnectedSocket {
+  TcpConnectedSocketProxyImpl _proxyImpl;
+
+  _TcpConnectedSocketProxyCalls(this._proxyImpl);
+}
+
+
+class TcpConnectedSocketProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  TcpConnectedSocket ptr;
+  final String name = TcpConnectedSocketName;
+
+  TcpConnectedSocketProxy(TcpConnectedSocketProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _TcpConnectedSocketProxyCalls(proxyImpl);
+
+  TcpConnectedSocketProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new TcpConnectedSocketProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _TcpConnectedSocketProxyCalls(impl);
+  }
+
+  TcpConnectedSocketProxy.fromHandle(core.MojoHandle handle) :
+      impl = new TcpConnectedSocketProxyImpl.fromHandle(handle) {
+    ptr = new _TcpConnectedSocketProxyCalls(impl);
+  }
+
+  TcpConnectedSocketProxy.unbound() :
+      impl = new TcpConnectedSocketProxyImpl.unbound() {
+    ptr = new _TcpConnectedSocketProxyCalls(impl);
+  }
+
+  factory TcpConnectedSocketProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    TcpConnectedSocketProxy p = new TcpConnectedSocketProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static TcpConnectedSocketProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For TcpConnectedSocketProxy"));
+    return new TcpConnectedSocketProxy.fromEndpoint(endpoint);
+  }
+
+  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)";
+  }
+}
+
+
+class TcpConnectedSocketStub extends bindings.Stub {
+  TcpConnectedSocket _impl = null;
+
+  TcpConnectedSocketStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  TcpConnectedSocketStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  TcpConnectedSocketStub.unbound() : super.unbound();
+
+  static TcpConnectedSocketStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For TcpConnectedSocketStub"));
+    return new TcpConnectedSocketStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = TcpConnectedSocketName;
+
+
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  TcpConnectedSocket get impl => _impl;
+  set impl(TcpConnectedSocket d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "TcpConnectedSocketStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+
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
new file mode 100644
index 0000000..2567ba0
--- /dev/null
+++ b/mojo/dart/packages/mojo_services/lib/mojo/tcp_server_socket.mojom.dart
@@ -0,0 +1,395 @@
+// 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.
+
+library tcp_server_socket_mojom;
+
+import 'dart:async';
+
+import 'package:mojo/bindings.dart' as bindings;
+import 'package:mojo/core.dart' as core;
+import 'package:mojo/mojo/network_error.mojom.dart' as network_error_mojom;
+import 'package:mojo_services/mojo/net_address.mojom.dart' as net_address_mojom;
+import 'package:mojo_services/mojo/tcp_connected_socket.mojom.dart' as tcp_connected_socket_mojom;
+
+
+
+class TcpServerSocketAcceptParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  core.MojoDataPipeConsumer sendStream = null;
+  core.MojoDataPipeProducer receiveStream = null;
+  Object clientSocket = null;
+
+  TcpServerSocketAcceptParams() : super(kVersions.last.size);
+
+  static TcpServerSocketAcceptParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static TcpServerSocketAcceptParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    TcpServerSocketAcceptParams result = new TcpServerSocketAcceptParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.sendStream = decoder0.decodeConsumerHandle(8, false);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.receiveStream = decoder0.decodeProducerHandle(12, false);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.clientSocket = decoder0.decodeInterfaceRequest(16, false, tcp_connected_socket_mojom.TcpConnectedSocketStub.newFromEndpoint);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeConsumerHandle(sendStream, 8, false);
+    
+    encoder0.encodeProducerHandle(receiveStream, 12, false);
+    
+    encoder0.encodeInterfaceRequest(clientSocket, 16, false);
+  }
+
+  String toString() {
+    return "TcpServerSocketAcceptParams("
+           "sendStream: $sendStream" ", "
+           "receiveStream: $receiveStream" ", "
+           "clientSocket: $clientSocket" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+
+class TcpServerSocketAcceptResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  network_error_mojom.NetworkError result = null;
+  net_address_mojom.NetAddress remoteAddress = null;
+
+  TcpServerSocketAcceptResponseParams() : super(kVersions.last.size);
+
+  static TcpServerSocketAcceptResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static TcpServerSocketAcceptResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    TcpServerSocketAcceptResponseParams result = new TcpServerSocketAcceptResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, false);
+      result.result = network_error_mojom.NetworkError.decode(decoder1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(16, true);
+      result.remoteAddress = net_address_mojom.NetAddress.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(result, 8, false);
+    
+    encoder0.encodeStruct(remoteAddress, 16, true);
+  }
+
+  String toString() {
+    return "TcpServerSocketAcceptResponseParams("
+           "result: $result" ", "
+           "remoteAddress: $remoteAddress" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["result"] = result;
+    map["remoteAddress"] = remoteAddress;
+    return map;
+  }
+}
+
+const int kTcpServerSocket_accept_name = 0;
+
+const String TcpServerSocketName =
+      'mojo::TCPServerSocket';
+
+abstract class TcpServerSocket {
+  dynamic accept(core.MojoDataPipeConsumer sendStream,core.MojoDataPipeProducer receiveStream,Object clientSocket,[Function responseFactory = null]);
+
+}
+
+
+class TcpServerSocketProxyImpl extends bindings.Proxy {
+  TcpServerSocketProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  TcpServerSocketProxyImpl.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);
+  }
+
+  String get name => TcpServerSocketName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      case kTcpServerSocket_accept_name:
+        var r = TcpServerSocketAcceptResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "TcpServerSocketProxyImpl($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,
+          kTcpServerSocket_accept_name,
+          -1,
+          bindings.MessageHeader.kMessageExpectsResponse);
+    }
+}
+
+
+class TcpServerSocketProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  TcpServerSocket ptr;
+  final String name = TcpServerSocketName;
+
+  TcpServerSocketProxy(TcpServerSocketProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _TcpServerSocketProxyCalls(proxyImpl);
+
+  TcpServerSocketProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new TcpServerSocketProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _TcpServerSocketProxyCalls(impl);
+  }
+
+  TcpServerSocketProxy.fromHandle(core.MojoHandle handle) :
+      impl = new TcpServerSocketProxyImpl.fromHandle(handle) {
+    ptr = new _TcpServerSocketProxyCalls(impl);
+  }
+
+  TcpServerSocketProxy.unbound() :
+      impl = new TcpServerSocketProxyImpl.unbound() {
+    ptr = new _TcpServerSocketProxyCalls(impl);
+  }
+
+  factory TcpServerSocketProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    TcpServerSocketProxy p = new TcpServerSocketProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static TcpServerSocketProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For TcpServerSocketProxy"));
+    return new TcpServerSocketProxy.fromEndpoint(endpoint);
+  }
+
+  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)";
+  }
+}
+
+
+class TcpServerSocketStub extends bindings.Stub {
+  TcpServerSocket _impl = null;
+
+  TcpServerSocketStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  TcpServerSocketStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  TcpServerSocketStub.unbound() : super.unbound();
+
+  static TcpServerSocketStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For TcpServerSocketStub"));
+    return new TcpServerSocketStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = TcpServerSocketName;
+
+
+  TcpServerSocketAcceptResponseParams _TcpServerSocketAcceptResponseParamsFactory(network_error_mojom.NetworkError result, net_address_mojom.NetAddress remoteAddress) {
+    var result = new TcpServerSocketAcceptResponseParams();
+    result.result = result;
+    result.remoteAddress = remoteAddress;
+    return result;
+  }
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      case kTcpServerSocket_accept_name:
+        var params = TcpServerSocketAcceptParams.deserialize(
+            message.payload);
+        var response = _impl.accept(params.sendStream,params.receiveStream,params.clientSocket,_TcpServerSocketAcceptResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kTcpServerSocket_accept_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kTcpServerSocket_accept_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  TcpServerSocket get impl => _impl;
+  set impl(TcpServerSocket d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "TcpServerSocketStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+
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
new file mode 100644
index 0000000..c064085
--- /dev/null
+++ b/mojo/dart/packages/mojo_services/lib/mojo/terminal/terminal.mojom.dart
@@ -0,0 +1,1024 @@
+// 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.
+
+library terminal_mojom;
+
+import 'dart:async';
+
+import 'package:mojo/bindings.dart' as bindings;
+import 'package:mojo/core.dart' as core;
+import 'package:mojo_services/mojo/files/file.mojom.dart' as file_mojom;
+import 'package:mojo_services/mojo/files/types.mojom.dart' as types_mojom;
+import 'package:mojo_services/mojo/terminal/terminal_client.mojom.dart' as terminal_client_mojom;
+
+
+
+class TerminalConnectParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  Object terminalFile = null;
+  bool force = false;
+
+  TerminalConnectParams() : super(kVersions.last.size);
+
+  static TerminalConnectParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static TerminalConnectParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    TerminalConnectParams result = new TerminalConnectParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.terminalFile = decoder0.decodeInterfaceRequest(8, false, file_mojom.FileStub.newFromEndpoint);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.force = decoder0.decodeBool(12, 0);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeInterfaceRequest(terminalFile, 8, false);
+    
+    encoder0.encodeBool(force, 12, 0);
+  }
+
+  String toString() {
+    return "TerminalConnectParams("
+           "terminalFile: $terminalFile" ", "
+           "force: $force" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+
+class TerminalConnectResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  types_mojom.Error error = null;
+
+  TerminalConnectResponseParams() : super(kVersions.last.size);
+
+  static TerminalConnectResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static TerminalConnectResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    TerminalConnectResponseParams result = new TerminalConnectResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+        result.error = types_mojom.Error.decode(decoder0, 8);
+        if (result.error == null) {
+          throw new bindings.MojoCodecError(
+            'Trying to decode null union for non-nullable types_mojom.Error.');
+        }
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeEnum(error, 8);
+  }
+
+  String toString() {
+    return "TerminalConnectResponseParams("
+           "error: $error" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["error"] = error;
+    return map;
+  }
+}
+
+
+class TerminalConnectToClientParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  Object terminalClient = null;
+  bool force = false;
+
+  TerminalConnectToClientParams() : super(kVersions.last.size);
+
+  static TerminalConnectToClientParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static TerminalConnectToClientParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    TerminalConnectToClientParams result = new TerminalConnectToClientParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.terminalClient = decoder0.decodeServiceInterface(8, false, terminal_client_mojom.TerminalClientProxy.newFromEndpoint);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.force = decoder0.decodeBool(16, 0);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeInterface(terminalClient, 8, false);
+    
+    encoder0.encodeBool(force, 16, 0);
+  }
+
+  String toString() {
+    return "TerminalConnectToClientParams("
+           "terminalClient: $terminalClient" ", "
+           "force: $force" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+
+class TerminalConnectToClientResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  types_mojom.Error error = null;
+
+  TerminalConnectToClientResponseParams() : super(kVersions.last.size);
+
+  static TerminalConnectToClientResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static TerminalConnectToClientResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    TerminalConnectToClientResponseParams result = new TerminalConnectToClientResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+        result.error = types_mojom.Error.decode(decoder0, 8);
+        if (result.error == null) {
+          throw new bindings.MojoCodecError(
+            'Trying to decode null union for non-nullable types_mojom.Error.');
+        }
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeEnum(error, 8);
+  }
+
+  String toString() {
+    return "TerminalConnectToClientResponseParams("
+           "error: $error" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["error"] = error;
+    return map;
+  }
+}
+
+
+class TerminalGetSizeParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(8, 0)
+  ];
+
+  TerminalGetSizeParams() : super(kVersions.last.size);
+
+  static TerminalGetSizeParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static TerminalGetSizeParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    TerminalGetSizeParams result = new TerminalGetSizeParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    encoder.getStructEncoderAtOffset(kVersions.last);
+  }
+
+  String toString() {
+    return "TerminalGetSizeParams("")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    return map;
+  }
+}
+
+
+class TerminalGetSizeResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  types_mojom.Error error = null;
+  int rows = 0;
+  int columns = 0;
+
+  TerminalGetSizeResponseParams() : super(kVersions.last.size);
+
+  static TerminalGetSizeResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static TerminalGetSizeResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    TerminalGetSizeResponseParams result = new TerminalGetSizeResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+        result.error = types_mojom.Error.decode(decoder0, 8);
+        if (result.error == null) {
+          throw new bindings.MojoCodecError(
+            'Trying to decode null union for non-nullable types_mojom.Error.');
+        }
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.rows = decoder0.decodeUint32(12);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.columns = decoder0.decodeUint32(16);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeEnum(error, 8);
+    
+    encoder0.encodeUint32(rows, 12);
+    
+    encoder0.encodeUint32(columns, 16);
+  }
+
+  String toString() {
+    return "TerminalGetSizeResponseParams("
+           "error: $error" ", "
+           "rows: $rows" ", "
+           "columns: $columns" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["error"] = error;
+    map["rows"] = rows;
+    map["columns"] = columns;
+    return map;
+  }
+}
+
+
+class TerminalSetSizeParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  int rows = 0;
+  int columns = 0;
+  bool reset = false;
+
+  TerminalSetSizeParams() : super(kVersions.last.size);
+
+  static TerminalSetSizeParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static TerminalSetSizeParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    TerminalSetSizeParams result = new TerminalSetSizeParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.rows = decoder0.decodeUint32(8);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.columns = decoder0.decodeUint32(12);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.reset = decoder0.decodeBool(16, 0);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeUint32(rows, 8);
+    
+    encoder0.encodeUint32(columns, 12);
+    
+    encoder0.encodeBool(reset, 16, 0);
+  }
+
+  String toString() {
+    return "TerminalSetSizeParams("
+           "rows: $rows" ", "
+           "columns: $columns" ", "
+           "reset: $reset" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["rows"] = rows;
+    map["columns"] = columns;
+    map["reset"] = reset;
+    return map;
+  }
+}
+
+
+class TerminalSetSizeResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  types_mojom.Error error = null;
+  int rows = 0;
+  int columns = 0;
+
+  TerminalSetSizeResponseParams() : super(kVersions.last.size);
+
+  static TerminalSetSizeResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static TerminalSetSizeResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    TerminalSetSizeResponseParams result = new TerminalSetSizeResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+        result.error = types_mojom.Error.decode(decoder0, 8);
+        if (result.error == null) {
+          throw new bindings.MojoCodecError(
+            'Trying to decode null union for non-nullable types_mojom.Error.');
+        }
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.rows = decoder0.decodeUint32(12);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.columns = decoder0.decodeUint32(16);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeEnum(error, 8);
+    
+    encoder0.encodeUint32(rows, 12);
+    
+    encoder0.encodeUint32(columns, 16);
+  }
+
+  String toString() {
+    return "TerminalSetSizeResponseParams("
+           "error: $error" ", "
+           "rows: $rows" ", "
+           "columns: $columns" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["error"] = error;
+    map["rows"] = rows;
+    map["columns"] = columns;
+    return map;
+  }
+}
+
+const int kTerminal_connect_name = 0;
+const int kTerminal_connectToClient_name = 1;
+const int kTerminal_getSize_name = 2;
+const int kTerminal_setSize_name = 3;
+
+const String TerminalName =
+      'mojo::terminal::Terminal';
+
+abstract class Terminal {
+  dynamic connect(Object terminalFile,bool force,[Function responseFactory = null]);
+  dynamic connectToClient(Object terminalClient,bool force,[Function responseFactory = null]);
+  dynamic getSize([Function responseFactory = null]);
+  dynamic setSize(int rows,int columns,bool reset,[Function responseFactory = null]);
+
+}
+
+
+class TerminalProxyImpl extends bindings.Proxy {
+  TerminalProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  TerminalProxyImpl.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);
+  }
+
+  String get name => TerminalName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      case kTerminal_connect_name:
+        var r = TerminalConnectResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      case kTerminal_connectToClient_name:
+        var r = TerminalConnectToClientResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      case kTerminal_getSize_name:
+        var r = TerminalGetSizeResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      case kTerminal_setSize_name:
+        var r = TerminalSetSizeResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "TerminalProxyImpl($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,
+          kTerminal_connect_name,
+          -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,
+          kTerminal_connectToClient_name,
+          -1,
+          bindings.MessageHeader.kMessageExpectsResponse);
+    }
+    dynamic getSize([Function responseFactory = null]) {
+      var params = new TerminalGetSizeParams();
+      return _proxyImpl.sendMessageWithRequestId(
+          params,
+          kTerminal_getSize_name,
+          -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,
+          kTerminal_setSize_name,
+          -1,
+          bindings.MessageHeader.kMessageExpectsResponse);
+    }
+}
+
+
+class TerminalProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  Terminal ptr;
+  final String name = TerminalName;
+
+  TerminalProxy(TerminalProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _TerminalProxyCalls(proxyImpl);
+
+  TerminalProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new TerminalProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _TerminalProxyCalls(impl);
+  }
+
+  TerminalProxy.fromHandle(core.MojoHandle handle) :
+      impl = new TerminalProxyImpl.fromHandle(handle) {
+    ptr = new _TerminalProxyCalls(impl);
+  }
+
+  TerminalProxy.unbound() :
+      impl = new TerminalProxyImpl.unbound() {
+    ptr = new _TerminalProxyCalls(impl);
+  }
+
+  factory TerminalProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    TerminalProxy p = new TerminalProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static TerminalProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For TerminalProxy"));
+    return new TerminalProxy.fromEndpoint(endpoint);
+  }
+
+  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 "TerminalProxy($impl)";
+  }
+}
+
+
+class TerminalStub extends bindings.Stub {
+  Terminal _impl = null;
+
+  TerminalStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  TerminalStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  TerminalStub.unbound() : super.unbound();
+
+  static TerminalStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For TerminalStub"));
+    return new TerminalStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = TerminalName;
+
+
+  TerminalConnectResponseParams _TerminalConnectResponseParamsFactory(types_mojom.Error error) {
+    var result = new TerminalConnectResponseParams();
+    result.error = error;
+    return result;
+  }
+  TerminalConnectToClientResponseParams _TerminalConnectToClientResponseParamsFactory(types_mojom.Error error) {
+    var result = new TerminalConnectToClientResponseParams();
+    result.error = error;
+    return result;
+  }
+  TerminalGetSizeResponseParams _TerminalGetSizeResponseParamsFactory(types_mojom.Error error, int rows, int columns) {
+    var result = new TerminalGetSizeResponseParams();
+    result.error = error;
+    result.rows = rows;
+    result.columns = columns;
+    return result;
+  }
+  TerminalSetSizeResponseParams _TerminalSetSizeResponseParamsFactory(types_mojom.Error error, int rows, int columns) {
+    var result = new TerminalSetSizeResponseParams();
+    result.error = error;
+    result.rows = rows;
+    result.columns = columns;
+    return result;
+  }
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      case kTerminal_connect_name:
+        var params = TerminalConnectParams.deserialize(
+            message.payload);
+        var response = _impl.connect(params.terminalFile,params.force,_TerminalConnectResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kTerminal_connect_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kTerminal_connect_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      case kTerminal_connectToClient_name:
+        var params = TerminalConnectToClientParams.deserialize(
+            message.payload);
+        var response = _impl.connectToClient(params.terminalClient,params.force,_TerminalConnectToClientResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kTerminal_connectToClient_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kTerminal_connectToClient_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      case kTerminal_getSize_name:
+        var params = TerminalGetSizeParams.deserialize(
+            message.payload);
+        var response = _impl.getSize(_TerminalGetSizeResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kTerminal_getSize_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kTerminal_getSize_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      case kTerminal_setSize_name:
+        var params = TerminalSetSizeParams.deserialize(
+            message.payload);
+        var response = _impl.setSize(params.rows,params.columns,params.reset,_TerminalSetSizeResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kTerminal_setSize_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kTerminal_setSize_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  Terminal get impl => _impl;
+  set impl(Terminal d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "TerminalStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+
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
new file mode 100644
index 0000000..5705c47
--- /dev/null
+++ b/mojo/dart/packages/mojo_services/lib/mojo/terminal/terminal_client.mojom.dart
@@ -0,0 +1,255 @@
+// 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.
+
+library terminal_client_mojom;
+
+import 'dart:async';
+
+import 'package:mojo/bindings.dart' as bindings;
+import 'package:mojo/core.dart' as core;
+import 'package:mojo_services/mojo/files/file.mojom.dart' as file_mojom;
+
+
+
+class TerminalClientConnectToTerminalParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  Object terminal = null;
+
+  TerminalClientConnectToTerminalParams() : super(kVersions.last.size);
+
+  static TerminalClientConnectToTerminalParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static TerminalClientConnectToTerminalParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    TerminalClientConnectToTerminalParams result = new TerminalClientConnectToTerminalParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.terminal = decoder0.decodeServiceInterface(8, false, file_mojom.FileProxy.newFromEndpoint);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeInterface(terminal, 8, false);
+  }
+
+  String toString() {
+    return "TerminalClientConnectToTerminalParams("
+           "terminal: $terminal" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+const int kTerminalClient_connectToTerminal_name = 0;
+
+const String TerminalClientName =
+      'mojo::terminal::TerminalClient';
+
+abstract class TerminalClient {
+  void connectToTerminal(Object terminal);
+
+}
+
+
+class TerminalClientProxyImpl extends bindings.Proxy {
+  TerminalClientProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  TerminalClientProxyImpl.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);
+  }
+
+  String get name => TerminalClientName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "TerminalClientProxyImpl($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, kTerminalClient_connectToTerminal_name);
+    }
+  
+}
+
+
+class TerminalClientProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  TerminalClient ptr;
+  final String name = TerminalClientName;
+
+  TerminalClientProxy(TerminalClientProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _TerminalClientProxyCalls(proxyImpl);
+
+  TerminalClientProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new TerminalClientProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _TerminalClientProxyCalls(impl);
+  }
+
+  TerminalClientProxy.fromHandle(core.MojoHandle handle) :
+      impl = new TerminalClientProxyImpl.fromHandle(handle) {
+    ptr = new _TerminalClientProxyCalls(impl);
+  }
+
+  TerminalClientProxy.unbound() :
+      impl = new TerminalClientProxyImpl.unbound() {
+    ptr = new _TerminalClientProxyCalls(impl);
+  }
+
+  factory TerminalClientProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    TerminalClientProxy p = new TerminalClientProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static TerminalClientProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For TerminalClientProxy"));
+    return new TerminalClientProxy.fromEndpoint(endpoint);
+  }
+
+  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)";
+  }
+}
+
+
+class TerminalClientStub extends bindings.Stub {
+  TerminalClient _impl = null;
+
+  TerminalClientStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  TerminalClientStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  TerminalClientStub.unbound() : super.unbound();
+
+  static TerminalClientStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For TerminalClientStub"));
+    return new TerminalClientStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = TerminalClientName;
+
+
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      case kTerminalClient_connectToTerminal_name:
+        var params = TerminalClientConnectToTerminalParams.deserialize(
+            message.payload);
+        _impl.connectToTerminal(params.terminal);
+        break;
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  TerminalClient get impl => _impl;
+  set impl(TerminalClient d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "TerminalClientStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+
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
new file mode 100644
index 0000000..8eaaa71
--- /dev/null
+++ b/mojo/dart/packages/mojo_services/lib/mojo/udp_socket.mojom.dart
@@ -0,0 +1,1910 @@
+// 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.
+
+library udp_socket_mojom;
+
+import 'dart:async';
+
+import 'package:mojo/bindings.dart' as bindings;
+import 'package:mojo/core.dart' as core;
+import 'package:mojo/mojo/network_error.mojom.dart' as network_error_mojom;
+import 'package:mojo_services/mojo/net_address.mojom.dart' as net_address_mojom;
+
+
+
+class UdpSocketAllowAddressReuseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(8, 0)
+  ];
+
+  UdpSocketAllowAddressReuseParams() : super(kVersions.last.size);
+
+  static UdpSocketAllowAddressReuseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static UdpSocketAllowAddressReuseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    UdpSocketAllowAddressReuseParams result = new UdpSocketAllowAddressReuseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    encoder.getStructEncoderAtOffset(kVersions.last);
+  }
+
+  String toString() {
+    return "UdpSocketAllowAddressReuseParams("")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    return map;
+  }
+}
+
+
+class UdpSocketAllowAddressReuseResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  network_error_mojom.NetworkError result = null;
+
+  UdpSocketAllowAddressReuseResponseParams() : super(kVersions.last.size);
+
+  static UdpSocketAllowAddressReuseResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static UdpSocketAllowAddressReuseResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    UdpSocketAllowAddressReuseResponseParams result = new UdpSocketAllowAddressReuseResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, false);
+      result.result = network_error_mojom.NetworkError.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(result, 8, false);
+  }
+
+  String toString() {
+    return "UdpSocketAllowAddressReuseResponseParams("
+           "result: $result" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["result"] = result;
+    return map;
+  }
+}
+
+
+class UdpSocketBindParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  net_address_mojom.NetAddress addr = null;
+
+  UdpSocketBindParams() : super(kVersions.last.size);
+
+  static UdpSocketBindParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static UdpSocketBindParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    UdpSocketBindParams result = new UdpSocketBindParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, false);
+      result.addr = net_address_mojom.NetAddress.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(addr, 8, false);
+  }
+
+  String toString() {
+    return "UdpSocketBindParams("
+           "addr: $addr" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["addr"] = addr;
+    return map;
+  }
+}
+
+
+class UdpSocketBindResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(32, 0)
+  ];
+  network_error_mojom.NetworkError result = null;
+  net_address_mojom.NetAddress boundAddr = null;
+  Object receiver = null;
+
+  UdpSocketBindResponseParams() : super(kVersions.last.size);
+
+  static UdpSocketBindResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static UdpSocketBindResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    UdpSocketBindResponseParams result = new UdpSocketBindResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, false);
+      result.result = network_error_mojom.NetworkError.decode(decoder1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(16, true);
+      result.boundAddr = net_address_mojom.NetAddress.decode(decoder1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.receiver = decoder0.decodeInterfaceRequest(24, true, UdpSocketReceiverStub.newFromEndpoint);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(result, 8, false);
+    
+    encoder0.encodeStruct(boundAddr, 16, true);
+    
+    encoder0.encodeInterfaceRequest(receiver, 24, true);
+  }
+
+  String toString() {
+    return "UdpSocketBindResponseParams("
+           "result: $result" ", "
+           "boundAddr: $boundAddr" ", "
+           "receiver: $receiver" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+
+class UdpSocketConnectParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  net_address_mojom.NetAddress remoteAddr = null;
+
+  UdpSocketConnectParams() : super(kVersions.last.size);
+
+  static UdpSocketConnectParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static UdpSocketConnectParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    UdpSocketConnectParams result = new UdpSocketConnectParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, false);
+      result.remoteAddr = net_address_mojom.NetAddress.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(remoteAddr, 8, false);
+  }
+
+  String toString() {
+    return "UdpSocketConnectParams("
+           "remoteAddr: $remoteAddr" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["remoteAddr"] = remoteAddr;
+    return map;
+  }
+}
+
+
+class UdpSocketConnectResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(32, 0)
+  ];
+  network_error_mojom.NetworkError result = null;
+  net_address_mojom.NetAddress localAddr = null;
+  Object receiver = null;
+
+  UdpSocketConnectResponseParams() : super(kVersions.last.size);
+
+  static UdpSocketConnectResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static UdpSocketConnectResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    UdpSocketConnectResponseParams result = new UdpSocketConnectResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, false);
+      result.result = network_error_mojom.NetworkError.decode(decoder1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(16, true);
+      result.localAddr = net_address_mojom.NetAddress.decode(decoder1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.receiver = decoder0.decodeInterfaceRequest(24, true, UdpSocketReceiverStub.newFromEndpoint);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(result, 8, false);
+    
+    encoder0.encodeStruct(localAddr, 16, true);
+    
+    encoder0.encodeInterfaceRequest(receiver, 24, true);
+  }
+
+  String toString() {
+    return "UdpSocketConnectResponseParams("
+           "result: $result" ", "
+           "localAddr: $localAddr" ", "
+           "receiver: $receiver" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+
+class UdpSocketSetSendBufferSizeParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  int size = 0;
+
+  UdpSocketSetSendBufferSizeParams() : super(kVersions.last.size);
+
+  static UdpSocketSetSendBufferSizeParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static UdpSocketSetSendBufferSizeParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    UdpSocketSetSendBufferSizeParams result = new UdpSocketSetSendBufferSizeParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.size = decoder0.decodeUint32(8);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeUint32(size, 8);
+  }
+
+  String toString() {
+    return "UdpSocketSetSendBufferSizeParams("
+           "size: $size" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["size"] = size;
+    return map;
+  }
+}
+
+
+class UdpSocketSetSendBufferSizeResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  network_error_mojom.NetworkError result = null;
+
+  UdpSocketSetSendBufferSizeResponseParams() : super(kVersions.last.size);
+
+  static UdpSocketSetSendBufferSizeResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static UdpSocketSetSendBufferSizeResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    UdpSocketSetSendBufferSizeResponseParams result = new UdpSocketSetSendBufferSizeResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, false);
+      result.result = network_error_mojom.NetworkError.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(result, 8, false);
+  }
+
+  String toString() {
+    return "UdpSocketSetSendBufferSizeResponseParams("
+           "result: $result" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["result"] = result;
+    return map;
+  }
+}
+
+
+class UdpSocketSetReceiveBufferSizeParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  int size = 0;
+
+  UdpSocketSetReceiveBufferSizeParams() : super(kVersions.last.size);
+
+  static UdpSocketSetReceiveBufferSizeParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static UdpSocketSetReceiveBufferSizeParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    UdpSocketSetReceiveBufferSizeParams result = new UdpSocketSetReceiveBufferSizeParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.size = decoder0.decodeUint32(8);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeUint32(size, 8);
+  }
+
+  String toString() {
+    return "UdpSocketSetReceiveBufferSizeParams("
+           "size: $size" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["size"] = size;
+    return map;
+  }
+}
+
+
+class UdpSocketSetReceiveBufferSizeResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  network_error_mojom.NetworkError result = null;
+
+  UdpSocketSetReceiveBufferSizeResponseParams() : super(kVersions.last.size);
+
+  static UdpSocketSetReceiveBufferSizeResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static UdpSocketSetReceiveBufferSizeResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    UdpSocketSetReceiveBufferSizeResponseParams result = new UdpSocketSetReceiveBufferSizeResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, false);
+      result.result = network_error_mojom.NetworkError.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(result, 8, false);
+  }
+
+  String toString() {
+    return "UdpSocketSetReceiveBufferSizeResponseParams("
+           "result: $result" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["result"] = result;
+    return map;
+  }
+}
+
+
+class UdpSocketNegotiateMaxPendingSendRequestsParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  int requestedSize = 0;
+
+  UdpSocketNegotiateMaxPendingSendRequestsParams() : super(kVersions.last.size);
+
+  static UdpSocketNegotiateMaxPendingSendRequestsParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static UdpSocketNegotiateMaxPendingSendRequestsParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    UdpSocketNegotiateMaxPendingSendRequestsParams result = new UdpSocketNegotiateMaxPendingSendRequestsParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.requestedSize = decoder0.decodeUint32(8);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeUint32(requestedSize, 8);
+  }
+
+  String toString() {
+    return "UdpSocketNegotiateMaxPendingSendRequestsParams("
+           "requestedSize: $requestedSize" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["requestedSize"] = requestedSize;
+    return map;
+  }
+}
+
+
+class UdpSocketNegotiateMaxPendingSendRequestsResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  int actualSize = 0;
+
+  UdpSocketNegotiateMaxPendingSendRequestsResponseParams() : super(kVersions.last.size);
+
+  static UdpSocketNegotiateMaxPendingSendRequestsResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static UdpSocketNegotiateMaxPendingSendRequestsResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    UdpSocketNegotiateMaxPendingSendRequestsResponseParams result = new UdpSocketNegotiateMaxPendingSendRequestsResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.actualSize = decoder0.decodeUint32(8);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeUint32(actualSize, 8);
+  }
+
+  String toString() {
+    return "UdpSocketNegotiateMaxPendingSendRequestsResponseParams("
+           "actualSize: $actualSize" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["actualSize"] = actualSize;
+    return map;
+  }
+}
+
+
+class UdpSocketReceiveMoreParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  int datagramNumber = 0;
+
+  UdpSocketReceiveMoreParams() : super(kVersions.last.size);
+
+  static UdpSocketReceiveMoreParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static UdpSocketReceiveMoreParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    UdpSocketReceiveMoreParams result = new UdpSocketReceiveMoreParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.datagramNumber = decoder0.decodeUint32(8);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeUint32(datagramNumber, 8);
+  }
+
+  String toString() {
+    return "UdpSocketReceiveMoreParams("
+           "datagramNumber: $datagramNumber" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["datagramNumber"] = datagramNumber;
+    return map;
+  }
+}
+
+
+class UdpSocketSendToParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  net_address_mojom.NetAddress destAddr = null;
+  List<int> data = null;
+
+  UdpSocketSendToParams() : super(kVersions.last.size);
+
+  static UdpSocketSendToParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static UdpSocketSendToParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    UdpSocketSendToParams result = new UdpSocketSendToParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, true);
+      result.destAddr = net_address_mojom.NetAddress.decode(decoder1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.data = decoder0.decodeUint8Array(16, bindings.kNothingNullable, bindings.kUnspecifiedArrayLength);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(destAddr, 8, true);
+    
+    encoder0.encodeUint8Array(data, 16, bindings.kNothingNullable, bindings.kUnspecifiedArrayLength);
+  }
+
+  String toString() {
+    return "UdpSocketSendToParams("
+           "destAddr: $destAddr" ", "
+           "data: $data" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["destAddr"] = destAddr;
+    map["data"] = data;
+    return map;
+  }
+}
+
+
+class UdpSocketSendToResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  network_error_mojom.NetworkError result = null;
+
+  UdpSocketSendToResponseParams() : super(kVersions.last.size);
+
+  static UdpSocketSendToResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static UdpSocketSendToResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    UdpSocketSendToResponseParams result = new UdpSocketSendToResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, false);
+      result.result = network_error_mojom.NetworkError.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(result, 8, false);
+  }
+
+  String toString() {
+    return "UdpSocketSendToResponseParams("
+           "result: $result" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["result"] = result;
+    return map;
+  }
+}
+
+
+class UdpSocketReceiverOnReceivedParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(32, 0)
+  ];
+  network_error_mojom.NetworkError result = null;
+  net_address_mojom.NetAddress srcAddr = null;
+  List<int> data = null;
+
+  UdpSocketReceiverOnReceivedParams() : super(kVersions.last.size);
+
+  static UdpSocketReceiverOnReceivedParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static UdpSocketReceiverOnReceivedParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    UdpSocketReceiverOnReceivedParams result = new UdpSocketReceiverOnReceivedParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, false);
+      result.result = network_error_mojom.NetworkError.decode(decoder1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(16, true);
+      result.srcAddr = net_address_mojom.NetAddress.decode(decoder1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.data = decoder0.decodeUint8Array(24, bindings.kArrayNullable, bindings.kUnspecifiedArrayLength);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(result, 8, false);
+    
+    encoder0.encodeStruct(srcAddr, 16, true);
+    
+    encoder0.encodeUint8Array(data, 24, bindings.kArrayNullable, bindings.kUnspecifiedArrayLength);
+  }
+
+  String toString() {
+    return "UdpSocketReceiverOnReceivedParams("
+           "result: $result" ", "
+           "srcAddr: $srcAddr" ", "
+           "data: $data" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["result"] = result;
+    map["srcAddr"] = srcAddr;
+    map["data"] = data;
+    return map;
+  }
+}
+
+const int kUdpSocket_allowAddressReuse_name = 0;
+const int kUdpSocket_bind_name = 1;
+const int kUdpSocket_connect_name = 2;
+const int kUdpSocket_setSendBufferSize_name = 3;
+const int kUdpSocket_setReceiveBufferSize_name = 4;
+const int kUdpSocket_negotiateMaxPendingSendRequests_name = 5;
+const int kUdpSocket_receiveMore_name = 6;
+const int kUdpSocket_sendTo_name = 7;
+
+const String UdpSocketName =
+      'mojo::UDPSocket';
+
+abstract class UdpSocket {
+  dynamic allowAddressReuse([Function responseFactory = null]);
+  dynamic bind(net_address_mojom.NetAddress addr,[Function responseFactory = null]);
+  dynamic connect(net_address_mojom.NetAddress remoteAddr,[Function responseFactory = null]);
+  dynamic setSendBufferSize(int size,[Function responseFactory = null]);
+  dynamic setReceiveBufferSize(int size,[Function responseFactory = null]);
+  dynamic negotiateMaxPendingSendRequests(int requestedSize,[Function responseFactory = null]);
+  void receiveMore(int datagramNumber);
+  dynamic sendTo(net_address_mojom.NetAddress destAddr,List<int> data,[Function responseFactory = null]);
+
+}
+
+
+class UdpSocketProxyImpl extends bindings.Proxy {
+  UdpSocketProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  UdpSocketProxyImpl.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);
+  }
+
+  String get name => UdpSocketName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      case kUdpSocket_allowAddressReuse_name:
+        var r = UdpSocketAllowAddressReuseResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      case kUdpSocket_bind_name:
+        var r = UdpSocketBindResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      case kUdpSocket_connect_name:
+        var r = UdpSocketConnectResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      case kUdpSocket_setSendBufferSize_name:
+        var r = UdpSocketSetSendBufferSizeResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      case kUdpSocket_setReceiveBufferSize_name:
+        var r = UdpSocketSetReceiveBufferSizeResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      case kUdpSocket_negotiateMaxPendingSendRequests_name:
+        var r = UdpSocketNegotiateMaxPendingSendRequestsResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      case kUdpSocket_sendTo_name:
+        var r = UdpSocketSendToResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "UdpSocketProxyImpl($superString)";
+  }
+}
+
+
+class _UdpSocketProxyCalls implements UdpSocket {
+  UdpSocketProxyImpl _proxyImpl;
+
+  _UdpSocketProxyCalls(this._proxyImpl);
+    dynamic allowAddressReuse([Function responseFactory = null]) {
+      var params = new UdpSocketAllowAddressReuseParams();
+      return _proxyImpl.sendMessageWithRequestId(
+          params,
+          kUdpSocket_allowAddressReuse_name,
+          -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,
+          kUdpSocket_bind_name,
+          -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,
+          kUdpSocket_connect_name,
+          -1,
+          bindings.MessageHeader.kMessageExpectsResponse);
+    }
+    dynamic setSendBufferSize(int size,[Function responseFactory = null]) {
+      var params = new UdpSocketSetSendBufferSizeParams();
+      params.size = size;
+      return _proxyImpl.sendMessageWithRequestId(
+          params,
+          kUdpSocket_setSendBufferSize_name,
+          -1,
+          bindings.MessageHeader.kMessageExpectsResponse);
+    }
+    dynamic setReceiveBufferSize(int size,[Function responseFactory = null]) {
+      var params = new UdpSocketSetReceiveBufferSizeParams();
+      params.size = size;
+      return _proxyImpl.sendMessageWithRequestId(
+          params,
+          kUdpSocket_setReceiveBufferSize_name,
+          -1,
+          bindings.MessageHeader.kMessageExpectsResponse);
+    }
+    dynamic negotiateMaxPendingSendRequests(int requestedSize,[Function responseFactory = null]) {
+      var params = new UdpSocketNegotiateMaxPendingSendRequestsParams();
+      params.requestedSize = requestedSize;
+      return _proxyImpl.sendMessageWithRequestId(
+          params,
+          kUdpSocket_negotiateMaxPendingSendRequests_name,
+          -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, kUdpSocket_receiveMore_name);
+    }
+  
+    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,
+          kUdpSocket_sendTo_name,
+          -1,
+          bindings.MessageHeader.kMessageExpectsResponse);
+    }
+}
+
+
+class UdpSocketProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  UdpSocket ptr;
+  final String name = UdpSocketName;
+
+  UdpSocketProxy(UdpSocketProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _UdpSocketProxyCalls(proxyImpl);
+
+  UdpSocketProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new UdpSocketProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _UdpSocketProxyCalls(impl);
+  }
+
+  UdpSocketProxy.fromHandle(core.MojoHandle handle) :
+      impl = new UdpSocketProxyImpl.fromHandle(handle) {
+    ptr = new _UdpSocketProxyCalls(impl);
+  }
+
+  UdpSocketProxy.unbound() :
+      impl = new UdpSocketProxyImpl.unbound() {
+    ptr = new _UdpSocketProxyCalls(impl);
+  }
+
+  factory UdpSocketProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    UdpSocketProxy p = new UdpSocketProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static UdpSocketProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For UdpSocketProxy"));
+    return new UdpSocketProxy.fromEndpoint(endpoint);
+  }
+
+  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 "UdpSocketProxy($impl)";
+  }
+}
+
+
+class UdpSocketStub extends bindings.Stub {
+  UdpSocket _impl = null;
+
+  UdpSocketStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  UdpSocketStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  UdpSocketStub.unbound() : super.unbound();
+
+  static UdpSocketStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For UdpSocketStub"));
+    return new UdpSocketStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = UdpSocketName;
+
+
+  UdpSocketAllowAddressReuseResponseParams _UdpSocketAllowAddressReuseResponseParamsFactory(network_error_mojom.NetworkError result) {
+    var result = new UdpSocketAllowAddressReuseResponseParams();
+    result.result = result;
+    return result;
+  }
+  UdpSocketBindResponseParams _UdpSocketBindResponseParamsFactory(network_error_mojom.NetworkError result, net_address_mojom.NetAddress boundAddr, Object receiver) {
+    var result = new UdpSocketBindResponseParams();
+    result.result = result;
+    result.boundAddr = boundAddr;
+    result.receiver = receiver;
+    return result;
+  }
+  UdpSocketConnectResponseParams _UdpSocketConnectResponseParamsFactory(network_error_mojom.NetworkError result, net_address_mojom.NetAddress localAddr, Object receiver) {
+    var result = new UdpSocketConnectResponseParams();
+    result.result = result;
+    result.localAddr = localAddr;
+    result.receiver = receiver;
+    return result;
+  }
+  UdpSocketSetSendBufferSizeResponseParams _UdpSocketSetSendBufferSizeResponseParamsFactory(network_error_mojom.NetworkError result) {
+    var result = new UdpSocketSetSendBufferSizeResponseParams();
+    result.result = result;
+    return result;
+  }
+  UdpSocketSetReceiveBufferSizeResponseParams _UdpSocketSetReceiveBufferSizeResponseParamsFactory(network_error_mojom.NetworkError result) {
+    var result = new UdpSocketSetReceiveBufferSizeResponseParams();
+    result.result = result;
+    return result;
+  }
+  UdpSocketNegotiateMaxPendingSendRequestsResponseParams _UdpSocketNegotiateMaxPendingSendRequestsResponseParamsFactory(int actualSize) {
+    var result = new UdpSocketNegotiateMaxPendingSendRequestsResponseParams();
+    result.actualSize = actualSize;
+    return result;
+  }
+  UdpSocketSendToResponseParams _UdpSocketSendToResponseParamsFactory(network_error_mojom.NetworkError result) {
+    var result = new UdpSocketSendToResponseParams();
+    result.result = result;
+    return result;
+  }
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      case kUdpSocket_allowAddressReuse_name:
+        var params = UdpSocketAllowAddressReuseParams.deserialize(
+            message.payload);
+        var response = _impl.allowAddressReuse(_UdpSocketAllowAddressReuseResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kUdpSocket_allowAddressReuse_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kUdpSocket_allowAddressReuse_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      case kUdpSocket_bind_name:
+        var params = UdpSocketBindParams.deserialize(
+            message.payload);
+        var response = _impl.bind(params.addr,_UdpSocketBindResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kUdpSocket_bind_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kUdpSocket_bind_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      case kUdpSocket_connect_name:
+        var params = UdpSocketConnectParams.deserialize(
+            message.payload);
+        var response = _impl.connect(params.remoteAddr,_UdpSocketConnectResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kUdpSocket_connect_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kUdpSocket_connect_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      case kUdpSocket_setSendBufferSize_name:
+        var params = UdpSocketSetSendBufferSizeParams.deserialize(
+            message.payload);
+        var response = _impl.setSendBufferSize(params.size,_UdpSocketSetSendBufferSizeResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kUdpSocket_setSendBufferSize_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kUdpSocket_setSendBufferSize_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      case kUdpSocket_setReceiveBufferSize_name:
+        var params = UdpSocketSetReceiveBufferSizeParams.deserialize(
+            message.payload);
+        var response = _impl.setReceiveBufferSize(params.size,_UdpSocketSetReceiveBufferSizeResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kUdpSocket_setReceiveBufferSize_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kUdpSocket_setReceiveBufferSize_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      case kUdpSocket_negotiateMaxPendingSendRequests_name:
+        var params = UdpSocketNegotiateMaxPendingSendRequestsParams.deserialize(
+            message.payload);
+        var response = _impl.negotiateMaxPendingSendRequests(params.requestedSize,_UdpSocketNegotiateMaxPendingSendRequestsResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kUdpSocket_negotiateMaxPendingSendRequests_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kUdpSocket_negotiateMaxPendingSendRequests_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      case kUdpSocket_receiveMore_name:
+        var params = UdpSocketReceiveMoreParams.deserialize(
+            message.payload);
+        _impl.receiveMore(params.datagramNumber);
+        break;
+      case kUdpSocket_sendTo_name:
+        var params = UdpSocketSendToParams.deserialize(
+            message.payload);
+        var response = _impl.sendTo(params.destAddr,params.data,_UdpSocketSendToResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kUdpSocket_sendTo_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kUdpSocket_sendTo_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  UdpSocket get impl => _impl;
+  set impl(UdpSocket d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "UdpSocketStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+const int kUdpSocketReceiver_onReceived_name = 0;
+
+const String UdpSocketReceiverName =
+      'mojo::UDPSocketReceiver';
+
+abstract class UdpSocketReceiver {
+  void onReceived(network_error_mojom.NetworkError result, net_address_mojom.NetAddress srcAddr, List<int> data);
+
+}
+
+
+class UdpSocketReceiverProxyImpl extends bindings.Proxy {
+  UdpSocketReceiverProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  UdpSocketReceiverProxyImpl.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);
+  }
+
+  String get name => UdpSocketReceiverName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "UdpSocketReceiverProxyImpl($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, kUdpSocketReceiver_onReceived_name);
+    }
+  
+}
+
+
+class UdpSocketReceiverProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  UdpSocketReceiver ptr;
+  final String name = UdpSocketReceiverName;
+
+  UdpSocketReceiverProxy(UdpSocketReceiverProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _UdpSocketReceiverProxyCalls(proxyImpl);
+
+  UdpSocketReceiverProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new UdpSocketReceiverProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _UdpSocketReceiverProxyCalls(impl);
+  }
+
+  UdpSocketReceiverProxy.fromHandle(core.MojoHandle handle) :
+      impl = new UdpSocketReceiverProxyImpl.fromHandle(handle) {
+    ptr = new _UdpSocketReceiverProxyCalls(impl);
+  }
+
+  UdpSocketReceiverProxy.unbound() :
+      impl = new UdpSocketReceiverProxyImpl.unbound() {
+    ptr = new _UdpSocketReceiverProxyCalls(impl);
+  }
+
+  factory UdpSocketReceiverProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    UdpSocketReceiverProxy p = new UdpSocketReceiverProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static UdpSocketReceiverProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For UdpSocketReceiverProxy"));
+    return new UdpSocketReceiverProxy.fromEndpoint(endpoint);
+  }
+
+  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)";
+  }
+}
+
+
+class UdpSocketReceiverStub extends bindings.Stub {
+  UdpSocketReceiver _impl = null;
+
+  UdpSocketReceiverStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  UdpSocketReceiverStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  UdpSocketReceiverStub.unbound() : super.unbound();
+
+  static UdpSocketReceiverStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For UdpSocketReceiverStub"));
+    return new UdpSocketReceiverStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = UdpSocketReceiverName;
+
+
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      case kUdpSocketReceiver_onReceived_name:
+        var params = UdpSocketReceiverOnReceivedParams.deserialize(
+            message.payload);
+        _impl.onReceived(params.result, params.srcAddr, params.data);
+        break;
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  UdpSocketReceiver get impl => _impl;
+  set impl(UdpSocketReceiver d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "UdpSocketReceiverStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/ui/layouts.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/ui/layouts.mojom.dart
new file mode 100644
index 0000000..bc16ff7
--- /dev/null
+++ b/mojo/dart/packages/mojo_services/lib/mojo/ui/layouts.mojom.dart
@@ -0,0 +1,264 @@
+// 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.
+
+library layouts_mojom;
+
+import 'dart:async';
+
+import 'package:mojo/bindings.dart' as bindings;
+import 'package:mojo/core.dart' as core;
+import 'package:mojo_services/mojo/geometry.mojom.dart' as geometry_mojom;
+import 'package:mojo_services/mojo/surface_id.mojom.dart' as surface_id_mojom;
+
+
+
+class BoxConstraints extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  int minWidth = 0;
+  int maxWidth = 0;
+  int minHeight = 0;
+  int maxHeight = 0;
+
+  BoxConstraints() : super(kVersions.last.size);
+
+  static BoxConstraints deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static BoxConstraints decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    BoxConstraints result = new BoxConstraints();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.minWidth = decoder0.decodeInt32(8);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.maxWidth = decoder0.decodeInt32(12);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.minHeight = decoder0.decodeInt32(16);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.maxHeight = decoder0.decodeInt32(20);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeInt32(minWidth, 8);
+    
+    encoder0.encodeInt32(maxWidth, 12);
+    
+    encoder0.encodeInt32(minHeight, 16);
+    
+    encoder0.encodeInt32(maxHeight, 20);
+  }
+
+  String toString() {
+    return "BoxConstraints("
+           "minWidth: $minWidth" ", "
+           "maxWidth: $maxWidth" ", "
+           "minHeight: $minHeight" ", "
+           "maxHeight: $maxHeight" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["minWidth"] = minWidth;
+    map["maxWidth"] = maxWidth;
+    map["minHeight"] = minHeight;
+    map["maxHeight"] = maxHeight;
+    return map;
+  }
+}
+
+
+class ViewLayoutParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  BoxConstraints constraints = null;
+  double devicePixelRatio = 1.0;
+
+  ViewLayoutParams() : super(kVersions.last.size);
+
+  static ViewLayoutParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ViewLayoutParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ViewLayoutParams result = new ViewLayoutParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, false);
+      result.constraints = BoxConstraints.decode(decoder1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.devicePixelRatio = decoder0.decodeFloat(16);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(constraints, 8, false);
+    
+    encoder0.encodeFloat(devicePixelRatio, 16);
+  }
+
+  String toString() {
+    return "ViewLayoutParams("
+           "constraints: $constraints" ", "
+           "devicePixelRatio: $devicePixelRatio" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["constraints"] = constraints;
+    map["devicePixelRatio"] = devicePixelRatio;
+    return map;
+  }
+}
+
+
+class ViewLayoutInfo extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  surface_id_mojom.SurfaceId surfaceId = null;
+  geometry_mojom.Size size = null;
+
+  ViewLayoutInfo() : super(kVersions.last.size);
+
+  static ViewLayoutInfo deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ViewLayoutInfo decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ViewLayoutInfo result = new ViewLayoutInfo();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, false);
+      result.surfaceId = surface_id_mojom.SurfaceId.decode(decoder1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(16, false);
+      result.size = geometry_mojom.Size.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(surfaceId, 8, false);
+    
+    encoder0.encodeStruct(size, 16, false);
+  }
+
+  String toString() {
+    return "ViewLayoutInfo("
+           "surfaceId: $surfaceId" ", "
+           "size: $size" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["surfaceId"] = surfaceId;
+    map["size"] = size;
+    return map;
+  }
+}
+
+
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
new file mode 100644
index 0000000..df01587
--- /dev/null
+++ b/mojo/dart/packages/mojo_services/lib/mojo/ui/view_manager.mojom.dart
@@ -0,0 +1,564 @@
+// 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.
+
+library view_manager_mojom;
+
+import 'dart:async';
+
+import 'package:mojo/bindings.dart' as bindings;
+import 'package:mojo/core.dart' as core;
+import 'package:mojo_services/mojo/ui/views.mojom.dart' as views_mojom;
+import 'package:mojo_services/mojo/ui/view_trees.mojom.dart' as view_trees_mojom;
+
+
+
+class ViewManagerRegisterViewParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  Object view = null;
+  Object viewHost = null;
+
+  ViewManagerRegisterViewParams() : super(kVersions.last.size);
+
+  static ViewManagerRegisterViewParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ViewManagerRegisterViewParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ViewManagerRegisterViewParams result = new ViewManagerRegisterViewParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.view = decoder0.decodeServiceInterface(8, false, views_mojom.ViewProxy.newFromEndpoint);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.viewHost = decoder0.decodeInterfaceRequest(16, false, views_mojom.ViewHostStub.newFromEndpoint);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeInterface(view, 8, false);
+    
+    encoder0.encodeInterfaceRequest(viewHost, 16, false);
+  }
+
+  String toString() {
+    return "ViewManagerRegisterViewParams("
+           "view: $view" ", "
+           "viewHost: $viewHost" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+
+class ViewManagerRegisterViewResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  views_mojom.ViewToken viewToken = null;
+
+  ViewManagerRegisterViewResponseParams() : super(kVersions.last.size);
+
+  static ViewManagerRegisterViewResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ViewManagerRegisterViewResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ViewManagerRegisterViewResponseParams result = new ViewManagerRegisterViewResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, false);
+      result.viewToken = views_mojom.ViewToken.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(viewToken, 8, false);
+  }
+
+  String toString() {
+    return "ViewManagerRegisterViewResponseParams("
+           "viewToken: $viewToken" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["viewToken"] = viewToken;
+    return map;
+  }
+}
+
+
+class ViewManagerRegisterViewTreeParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  Object viewTree = null;
+  Object viewTreeHost = null;
+
+  ViewManagerRegisterViewTreeParams() : super(kVersions.last.size);
+
+  static ViewManagerRegisterViewTreeParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ViewManagerRegisterViewTreeParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ViewManagerRegisterViewTreeParams result = new ViewManagerRegisterViewTreeParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.viewTree = decoder0.decodeServiceInterface(8, false, view_trees_mojom.ViewTreeProxy.newFromEndpoint);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.viewTreeHost = decoder0.decodeInterfaceRequest(16, false, view_trees_mojom.ViewTreeHostStub.newFromEndpoint);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeInterface(viewTree, 8, false);
+    
+    encoder0.encodeInterfaceRequest(viewTreeHost, 16, false);
+  }
+
+  String toString() {
+    return "ViewManagerRegisterViewTreeParams("
+           "viewTree: $viewTree" ", "
+           "viewTreeHost: $viewTreeHost" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+
+class ViewManagerRegisterViewTreeResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(8, 0)
+  ];
+
+  ViewManagerRegisterViewTreeResponseParams() : super(kVersions.last.size);
+
+  static ViewManagerRegisterViewTreeResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ViewManagerRegisterViewTreeResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ViewManagerRegisterViewTreeResponseParams result = new ViewManagerRegisterViewTreeResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    encoder.getStructEncoderAtOffset(kVersions.last);
+  }
+
+  String toString() {
+    return "ViewManagerRegisterViewTreeResponseParams("")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    return map;
+  }
+}
+
+const int kViewManager_registerView_name = 0;
+const int kViewManager_registerViewTree_name = 1;
+
+const String ViewManagerName =
+      'mojo::ui::ViewManager';
+
+abstract class ViewManager {
+  dynamic registerView(Object view,Object viewHost,[Function responseFactory = null]);
+  dynamic registerViewTree(Object viewTree,Object viewTreeHost,[Function responseFactory = null]);
+
+}
+
+
+class ViewManagerProxyImpl extends bindings.Proxy {
+  ViewManagerProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  ViewManagerProxyImpl.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);
+  }
+
+  String get name => ViewManagerName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      case kViewManager_registerView_name:
+        var r = ViewManagerRegisterViewResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      case kViewManager_registerViewTree_name:
+        var r = ViewManagerRegisterViewTreeResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "ViewManagerProxyImpl($superString)";
+  }
+}
+
+
+class _ViewManagerProxyCalls implements ViewManager {
+  ViewManagerProxyImpl _proxyImpl;
+
+  _ViewManagerProxyCalls(this._proxyImpl);
+    dynamic registerView(Object view,Object viewHost,[Function responseFactory = null]) {
+      var params = new ViewManagerRegisterViewParams();
+      params.view = view;
+      params.viewHost = viewHost;
+      return _proxyImpl.sendMessageWithRequestId(
+          params,
+          kViewManager_registerView_name,
+          -1,
+          bindings.MessageHeader.kMessageExpectsResponse);
+    }
+    dynamic registerViewTree(Object viewTree,Object viewTreeHost,[Function responseFactory = null]) {
+      var params = new ViewManagerRegisterViewTreeParams();
+      params.viewTree = viewTree;
+      params.viewTreeHost = viewTreeHost;
+      return _proxyImpl.sendMessageWithRequestId(
+          params,
+          kViewManager_registerViewTree_name,
+          -1,
+          bindings.MessageHeader.kMessageExpectsResponse);
+    }
+}
+
+
+class ViewManagerProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  ViewManager ptr;
+  final String name = ViewManagerName;
+
+  ViewManagerProxy(ViewManagerProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _ViewManagerProxyCalls(proxyImpl);
+
+  ViewManagerProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new ViewManagerProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _ViewManagerProxyCalls(impl);
+  }
+
+  ViewManagerProxy.fromHandle(core.MojoHandle handle) :
+      impl = new ViewManagerProxyImpl.fromHandle(handle) {
+    ptr = new _ViewManagerProxyCalls(impl);
+  }
+
+  ViewManagerProxy.unbound() :
+      impl = new ViewManagerProxyImpl.unbound() {
+    ptr = new _ViewManagerProxyCalls(impl);
+  }
+
+  factory ViewManagerProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    ViewManagerProxy p = new ViewManagerProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static ViewManagerProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ViewManagerProxy"));
+    return new ViewManagerProxy.fromEndpoint(endpoint);
+  }
+
+  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)";
+  }
+}
+
+
+class ViewManagerStub extends bindings.Stub {
+  ViewManager _impl = null;
+
+  ViewManagerStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  ViewManagerStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  ViewManagerStub.unbound() : super.unbound();
+
+  static ViewManagerStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ViewManagerStub"));
+    return new ViewManagerStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = ViewManagerName;
+
+
+  ViewManagerRegisterViewResponseParams _ViewManagerRegisterViewResponseParamsFactory(views_mojom.ViewToken viewToken) {
+    var result = new ViewManagerRegisterViewResponseParams();
+    result.viewToken = viewToken;
+    return result;
+  }
+  ViewManagerRegisterViewTreeResponseParams _ViewManagerRegisterViewTreeResponseParamsFactory() {
+    var result = new ViewManagerRegisterViewTreeResponseParams();
+    return result;
+  }
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      case kViewManager_registerView_name:
+        var params = ViewManagerRegisterViewParams.deserialize(
+            message.payload);
+        var response = _impl.registerView(params.view,params.viewHost,_ViewManagerRegisterViewResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kViewManager_registerView_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kViewManager_registerView_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      case kViewManager_registerViewTree_name:
+        var params = ViewManagerRegisterViewTreeParams.deserialize(
+            message.payload);
+        var response = _impl.registerViewTree(params.viewTree,params.viewTreeHost,_ViewManagerRegisterViewTreeResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kViewManager_registerViewTree_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kViewManager_registerViewTree_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  ViewManager get impl => _impl;
+  set impl(ViewManager d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "ViewManagerStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+
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
new file mode 100644
index 0000000..bb5c712
--- /dev/null
+++ b/mojo/dart/packages/mojo_services/lib/mojo/ui/view_provider.mojom.dart
@@ -0,0 +1,374 @@
+// 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.
+
+library view_provider_mojom;
+
+import 'dart:async';
+
+import 'package:mojo/bindings.dart' as bindings;
+import 'package:mojo/core.dart' as core;
+import 'package:mojo/mojo/service_provider.mojom.dart' as service_provider_mojom;
+import 'package:mojo_services/mojo/ui/views.mojom.dart' as views_mojom;
+
+
+
+class ViewProviderCreateViewParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  Object services = null;
+  Object exposedServices = null;
+
+  ViewProviderCreateViewParams() : super(kVersions.last.size);
+
+  static ViewProviderCreateViewParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ViewProviderCreateViewParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ViewProviderCreateViewParams result = new ViewProviderCreateViewParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.services = decoder0.decodeInterfaceRequest(8, true, service_provider_mojom.ServiceProviderStub.newFromEndpoint);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.exposedServices = decoder0.decodeServiceInterface(12, true, service_provider_mojom.ServiceProviderProxy.newFromEndpoint);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeInterfaceRequest(services, 8, true);
+    
+    encoder0.encodeInterface(exposedServices, 12, true);
+  }
+
+  String toString() {
+    return "ViewProviderCreateViewParams("
+           "services: $services" ", "
+           "exposedServices: $exposedServices" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+
+class ViewProviderCreateViewResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  views_mojom.ViewToken viewToken = null;
+
+  ViewProviderCreateViewResponseParams() : super(kVersions.last.size);
+
+  static ViewProviderCreateViewResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ViewProviderCreateViewResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ViewProviderCreateViewResponseParams result = new ViewProviderCreateViewResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, false);
+      result.viewToken = views_mojom.ViewToken.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(viewToken, 8, false);
+  }
+
+  String toString() {
+    return "ViewProviderCreateViewResponseParams("
+           "viewToken: $viewToken" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["viewToken"] = viewToken;
+    return map;
+  }
+}
+
+const int kViewProvider_createView_name = 0;
+
+const String ViewProviderName =
+      'mojo::ui::ViewProvider';
+
+abstract class ViewProvider {
+  dynamic createView(Object services,Object exposedServices,[Function responseFactory = null]);
+
+}
+
+
+class ViewProviderProxyImpl extends bindings.Proxy {
+  ViewProviderProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  ViewProviderProxyImpl.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);
+  }
+
+  String get name => ViewProviderName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      case kViewProvider_createView_name:
+        var r = ViewProviderCreateViewResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "ViewProviderProxyImpl($superString)";
+  }
+}
+
+
+class _ViewProviderProxyCalls implements ViewProvider {
+  ViewProviderProxyImpl _proxyImpl;
+
+  _ViewProviderProxyCalls(this._proxyImpl);
+    dynamic createView(Object services,Object exposedServices,[Function responseFactory = null]) {
+      var params = new ViewProviderCreateViewParams();
+      params.services = services;
+      params.exposedServices = exposedServices;
+      return _proxyImpl.sendMessageWithRequestId(
+          params,
+          kViewProvider_createView_name,
+          -1,
+          bindings.MessageHeader.kMessageExpectsResponse);
+    }
+}
+
+
+class ViewProviderProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  ViewProvider ptr;
+  final String name = ViewProviderName;
+
+  ViewProviderProxy(ViewProviderProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _ViewProviderProxyCalls(proxyImpl);
+
+  ViewProviderProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new ViewProviderProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _ViewProviderProxyCalls(impl);
+  }
+
+  ViewProviderProxy.fromHandle(core.MojoHandle handle) :
+      impl = new ViewProviderProxyImpl.fromHandle(handle) {
+    ptr = new _ViewProviderProxyCalls(impl);
+  }
+
+  ViewProviderProxy.unbound() :
+      impl = new ViewProviderProxyImpl.unbound() {
+    ptr = new _ViewProviderProxyCalls(impl);
+  }
+
+  factory ViewProviderProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    ViewProviderProxy p = new ViewProviderProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static ViewProviderProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ViewProviderProxy"));
+    return new ViewProviderProxy.fromEndpoint(endpoint);
+  }
+
+  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)";
+  }
+}
+
+
+class ViewProviderStub extends bindings.Stub {
+  ViewProvider _impl = null;
+
+  ViewProviderStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  ViewProviderStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  ViewProviderStub.unbound() : super.unbound();
+
+  static ViewProviderStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ViewProviderStub"));
+    return new ViewProviderStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = ViewProviderName;
+
+
+  ViewProviderCreateViewResponseParams _ViewProviderCreateViewResponseParamsFactory(views_mojom.ViewToken viewToken) {
+    var result = new ViewProviderCreateViewResponseParams();
+    result.viewToken = viewToken;
+    return result;
+  }
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      case kViewProvider_createView_name:
+        var params = ViewProviderCreateViewParams.deserialize(
+            message.payload);
+        var response = _impl.createView(params.services,params.exposedServices,_ViewProviderCreateViewResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kViewProvider_createView_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kViewProvider_createView_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  ViewProvider get impl => _impl;
+  set impl(ViewProvider d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "ViewProviderStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+
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
new file mode 100644
index 0000000..ba28e2c
--- /dev/null
+++ b/mojo/dart/packages/mojo_services/lib/mojo/ui/view_trees.mojom.dart
@@ -0,0 +1,1122 @@
+// 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.
+
+library view_trees_mojom;
+
+import 'dart:async';
+
+import 'package:mojo/bindings.dart' as bindings;
+import 'package:mojo/core.dart' as core;
+import 'package:mojo_services/mojo/ui/layouts.mojom.dart' as layouts_mojom;
+import 'package:mojo_services/mojo/ui/views.mojom.dart' as views_mojom;
+
+
+
+class ViewTreeOnLayoutParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(8, 0)
+  ];
+
+  ViewTreeOnLayoutParams() : super(kVersions.last.size);
+
+  static ViewTreeOnLayoutParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ViewTreeOnLayoutParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ViewTreeOnLayoutParams result = new ViewTreeOnLayoutParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    encoder.getStructEncoderAtOffset(kVersions.last);
+  }
+
+  String toString() {
+    return "ViewTreeOnLayoutParams("")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    return map;
+  }
+}
+
+
+class ViewTreeOnLayoutResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(8, 0)
+  ];
+
+  ViewTreeOnLayoutResponseParams() : super(kVersions.last.size);
+
+  static ViewTreeOnLayoutResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ViewTreeOnLayoutResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ViewTreeOnLayoutResponseParams result = new ViewTreeOnLayoutResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    encoder.getStructEncoderAtOffset(kVersions.last);
+  }
+
+  String toString() {
+    return "ViewTreeOnLayoutResponseParams("")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    return map;
+  }
+}
+
+
+class ViewTreeOnRootUnavailableParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  int rootKey = 0;
+
+  ViewTreeOnRootUnavailableParams() : super(kVersions.last.size);
+
+  static ViewTreeOnRootUnavailableParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ViewTreeOnRootUnavailableParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ViewTreeOnRootUnavailableParams result = new ViewTreeOnRootUnavailableParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.rootKey = decoder0.decodeUint32(8);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeUint32(rootKey, 8);
+  }
+
+  String toString() {
+    return "ViewTreeOnRootUnavailableParams("
+           "rootKey: $rootKey" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["rootKey"] = rootKey;
+    return map;
+  }
+}
+
+
+class ViewTreeOnRootUnavailableResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(8, 0)
+  ];
+
+  ViewTreeOnRootUnavailableResponseParams() : super(kVersions.last.size);
+
+  static ViewTreeOnRootUnavailableResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ViewTreeOnRootUnavailableResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ViewTreeOnRootUnavailableResponseParams result = new ViewTreeOnRootUnavailableResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    encoder.getStructEncoderAtOffset(kVersions.last);
+  }
+
+  String toString() {
+    return "ViewTreeOnRootUnavailableResponseParams("")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    return map;
+  }
+}
+
+
+class ViewTreeHostRequestLayoutParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(8, 0)
+  ];
+
+  ViewTreeHostRequestLayoutParams() : super(kVersions.last.size);
+
+  static ViewTreeHostRequestLayoutParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ViewTreeHostRequestLayoutParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ViewTreeHostRequestLayoutParams result = new ViewTreeHostRequestLayoutParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    encoder.getStructEncoderAtOffset(kVersions.last);
+  }
+
+  String toString() {
+    return "ViewTreeHostRequestLayoutParams("")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    return map;
+  }
+}
+
+
+class ViewTreeHostSetRootParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  int rootKey = 0;
+  views_mojom.ViewToken rootViewToken = null;
+
+  ViewTreeHostSetRootParams() : super(kVersions.last.size);
+
+  static ViewTreeHostSetRootParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ViewTreeHostSetRootParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ViewTreeHostSetRootParams result = new ViewTreeHostSetRootParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.rootKey = decoder0.decodeUint32(8);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(16, false);
+      result.rootViewToken = views_mojom.ViewToken.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeUint32(rootKey, 8);
+    
+    encoder0.encodeStruct(rootViewToken, 16, false);
+  }
+
+  String toString() {
+    return "ViewTreeHostSetRootParams("
+           "rootKey: $rootKey" ", "
+           "rootViewToken: $rootViewToken" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["rootKey"] = rootKey;
+    map["rootViewToken"] = rootViewToken;
+    return map;
+  }
+}
+
+
+class ViewTreeHostResetRootParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(8, 0)
+  ];
+
+  ViewTreeHostResetRootParams() : super(kVersions.last.size);
+
+  static ViewTreeHostResetRootParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ViewTreeHostResetRootParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ViewTreeHostResetRootParams result = new ViewTreeHostResetRootParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    encoder.getStructEncoderAtOffset(kVersions.last);
+  }
+
+  String toString() {
+    return "ViewTreeHostResetRootParams("")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    return map;
+  }
+}
+
+
+class ViewTreeHostLayoutRootParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  layouts_mojom.ViewLayoutParams rootLayoutParams = null;
+
+  ViewTreeHostLayoutRootParams() : super(kVersions.last.size);
+
+  static ViewTreeHostLayoutRootParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ViewTreeHostLayoutRootParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ViewTreeHostLayoutRootParams result = new ViewTreeHostLayoutRootParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, false);
+      result.rootLayoutParams = layouts_mojom.ViewLayoutParams.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(rootLayoutParams, 8, false);
+  }
+
+  String toString() {
+    return "ViewTreeHostLayoutRootParams("
+           "rootLayoutParams: $rootLayoutParams" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["rootLayoutParams"] = rootLayoutParams;
+    return map;
+  }
+}
+
+
+class ViewTreeHostLayoutRootResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  layouts_mojom.ViewLayoutInfo info = null;
+
+  ViewTreeHostLayoutRootResponseParams() : super(kVersions.last.size);
+
+  static ViewTreeHostLayoutRootResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ViewTreeHostLayoutRootResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ViewTreeHostLayoutRootResponseParams result = new ViewTreeHostLayoutRootResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, true);
+      result.info = layouts_mojom.ViewLayoutInfo.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(info, 8, true);
+  }
+
+  String toString() {
+    return "ViewTreeHostLayoutRootResponseParams("
+           "info: $info" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["info"] = info;
+    return map;
+  }
+}
+
+const int kViewTree_onLayout_name = 0;
+const int kViewTree_onRootUnavailable_name = 1;
+
+const String ViewTreeName =
+      'mojo::ui::ViewTree';
+
+abstract class ViewTree {
+  dynamic onLayout([Function responseFactory = null]);
+  dynamic onRootUnavailable(int rootKey,[Function responseFactory = null]);
+
+}
+
+
+class ViewTreeProxyImpl extends bindings.Proxy {
+  ViewTreeProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  ViewTreeProxyImpl.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);
+  }
+
+  String get name => ViewTreeName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      case kViewTree_onLayout_name:
+        var r = ViewTreeOnLayoutResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      case kViewTree_onRootUnavailable_name:
+        var r = ViewTreeOnRootUnavailableResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "ViewTreeProxyImpl($superString)";
+  }
+}
+
+
+class _ViewTreeProxyCalls implements ViewTree {
+  ViewTreeProxyImpl _proxyImpl;
+
+  _ViewTreeProxyCalls(this._proxyImpl);
+    dynamic onLayout([Function responseFactory = null]) {
+      var params = new ViewTreeOnLayoutParams();
+      return _proxyImpl.sendMessageWithRequestId(
+          params,
+          kViewTree_onLayout_name,
+          -1,
+          bindings.MessageHeader.kMessageExpectsResponse);
+    }
+    dynamic onRootUnavailable(int rootKey,[Function responseFactory = null]) {
+      var params = new ViewTreeOnRootUnavailableParams();
+      params.rootKey = rootKey;
+      return _proxyImpl.sendMessageWithRequestId(
+          params,
+          kViewTree_onRootUnavailable_name,
+          -1,
+          bindings.MessageHeader.kMessageExpectsResponse);
+    }
+}
+
+
+class ViewTreeProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  ViewTree ptr;
+  final String name = ViewTreeName;
+
+  ViewTreeProxy(ViewTreeProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _ViewTreeProxyCalls(proxyImpl);
+
+  ViewTreeProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new ViewTreeProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _ViewTreeProxyCalls(impl);
+  }
+
+  ViewTreeProxy.fromHandle(core.MojoHandle handle) :
+      impl = new ViewTreeProxyImpl.fromHandle(handle) {
+    ptr = new _ViewTreeProxyCalls(impl);
+  }
+
+  ViewTreeProxy.unbound() :
+      impl = new ViewTreeProxyImpl.unbound() {
+    ptr = new _ViewTreeProxyCalls(impl);
+  }
+
+  factory ViewTreeProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    ViewTreeProxy p = new ViewTreeProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static ViewTreeProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ViewTreeProxy"));
+    return new ViewTreeProxy.fromEndpoint(endpoint);
+  }
+
+  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 "ViewTreeProxy($impl)";
+  }
+}
+
+
+class ViewTreeStub extends bindings.Stub {
+  ViewTree _impl = null;
+
+  ViewTreeStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  ViewTreeStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  ViewTreeStub.unbound() : super.unbound();
+
+  static ViewTreeStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ViewTreeStub"));
+    return new ViewTreeStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = ViewTreeName;
+
+
+  ViewTreeOnLayoutResponseParams _ViewTreeOnLayoutResponseParamsFactory() {
+    var result = new ViewTreeOnLayoutResponseParams();
+    return result;
+  }
+  ViewTreeOnRootUnavailableResponseParams _ViewTreeOnRootUnavailableResponseParamsFactory() {
+    var result = new ViewTreeOnRootUnavailableResponseParams();
+    return result;
+  }
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      case kViewTree_onLayout_name:
+        var params = ViewTreeOnLayoutParams.deserialize(
+            message.payload);
+        var response = _impl.onLayout(_ViewTreeOnLayoutResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kViewTree_onLayout_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kViewTree_onLayout_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      case kViewTree_onRootUnavailable_name:
+        var params = ViewTreeOnRootUnavailableParams.deserialize(
+            message.payload);
+        var response = _impl.onRootUnavailable(params.rootKey,_ViewTreeOnRootUnavailableResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kViewTree_onRootUnavailable_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kViewTree_onRootUnavailable_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  ViewTree get impl => _impl;
+  set impl(ViewTree d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "ViewTreeStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+const int kViewTreeHost_requestLayout_name = 0;
+const int kViewTreeHost_setRoot_name = 1;
+const int kViewTreeHost_resetRoot_name = 2;
+const int kViewTreeHost_layoutRoot_name = 3;
+
+const String ViewTreeHostName =
+      'mojo::ui::ViewTreeHost';
+
+abstract class ViewTreeHost {
+  void requestLayout();
+  void setRoot(int rootKey, views_mojom.ViewToken rootViewToken);
+  void resetRoot();
+  dynamic layoutRoot(layouts_mojom.ViewLayoutParams rootLayoutParams,[Function responseFactory = null]);
+
+}
+
+
+class ViewTreeHostProxyImpl extends bindings.Proxy {
+  ViewTreeHostProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  ViewTreeHostProxyImpl.fromHandle(core.MojoHandle handle) :
+      super.fromHandle(handle);
+
+  ViewTreeHostProxyImpl.unbound() : super.unbound();
+
+  static ViewTreeHostProxyImpl newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ViewTreeHostProxyImpl"));
+    return new ViewTreeHostProxyImpl.fromEndpoint(endpoint);
+  }
+
+  String get name => ViewTreeHostName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      case kViewTreeHost_layoutRoot_name:
+        var r = ViewTreeHostLayoutRootResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "ViewTreeHostProxyImpl($superString)";
+  }
+}
+
+
+class _ViewTreeHostProxyCalls implements ViewTreeHost {
+  ViewTreeHostProxyImpl _proxyImpl;
+
+  _ViewTreeHostProxyCalls(this._proxyImpl);
+    void requestLayout() {
+      if (!_proxyImpl.isBound) {
+        _proxyImpl.proxyError("The Proxy is closed.");
+        return;
+      }
+      var params = new ViewTreeHostRequestLayoutParams();
+      _proxyImpl.sendMessage(params, kViewTreeHost_requestLayout_name);
+    }
+  
+    void setRoot(int rootKey, views_mojom.ViewToken rootViewToken) {
+      if (!_proxyImpl.isBound) {
+        _proxyImpl.proxyError("The Proxy is closed.");
+        return;
+      }
+      var params = new ViewTreeHostSetRootParams();
+      params.rootKey = rootKey;
+      params.rootViewToken = rootViewToken;
+      _proxyImpl.sendMessage(params, kViewTreeHost_setRoot_name);
+    }
+  
+    void resetRoot() {
+      if (!_proxyImpl.isBound) {
+        _proxyImpl.proxyError("The Proxy is closed.");
+        return;
+      }
+      var params = new ViewTreeHostResetRootParams();
+      _proxyImpl.sendMessage(params, kViewTreeHost_resetRoot_name);
+    }
+  
+    dynamic layoutRoot(layouts_mojom.ViewLayoutParams rootLayoutParams,[Function responseFactory = null]) {
+      var params = new ViewTreeHostLayoutRootParams();
+      params.rootLayoutParams = rootLayoutParams;
+      return _proxyImpl.sendMessageWithRequestId(
+          params,
+          kViewTreeHost_layoutRoot_name,
+          -1,
+          bindings.MessageHeader.kMessageExpectsResponse);
+    }
+}
+
+
+class ViewTreeHostProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  ViewTreeHost ptr;
+  final String name = ViewTreeHostName;
+
+  ViewTreeHostProxy(ViewTreeHostProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _ViewTreeHostProxyCalls(proxyImpl);
+
+  ViewTreeHostProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new ViewTreeHostProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _ViewTreeHostProxyCalls(impl);
+  }
+
+  ViewTreeHostProxy.fromHandle(core.MojoHandle handle) :
+      impl = new ViewTreeHostProxyImpl.fromHandle(handle) {
+    ptr = new _ViewTreeHostProxyCalls(impl);
+  }
+
+  ViewTreeHostProxy.unbound() :
+      impl = new ViewTreeHostProxyImpl.unbound() {
+    ptr = new _ViewTreeHostProxyCalls(impl);
+  }
+
+  factory ViewTreeHostProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    ViewTreeHostProxy p = new ViewTreeHostProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static ViewTreeHostProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ViewTreeHostProxy"));
+    return new ViewTreeHostProxy.fromEndpoint(endpoint);
+  }
+
+  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 "ViewTreeHostProxy($impl)";
+  }
+}
+
+
+class ViewTreeHostStub extends bindings.Stub {
+  ViewTreeHost _impl = null;
+
+  ViewTreeHostStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  ViewTreeHostStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  ViewTreeHostStub.unbound() : super.unbound();
+
+  static ViewTreeHostStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ViewTreeHostStub"));
+    return new ViewTreeHostStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = ViewTreeHostName;
+
+
+  ViewTreeHostLayoutRootResponseParams _ViewTreeHostLayoutRootResponseParamsFactory(layouts_mojom.ViewLayoutInfo info) {
+    var result = new ViewTreeHostLayoutRootResponseParams();
+    result.info = info;
+    return result;
+  }
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      case kViewTreeHost_requestLayout_name:
+        var params = ViewTreeHostRequestLayoutParams.deserialize(
+            message.payload);
+        _impl.requestLayout();
+        break;
+      case kViewTreeHost_setRoot_name:
+        var params = ViewTreeHostSetRootParams.deserialize(
+            message.payload);
+        _impl.setRoot(params.rootKey, params.rootViewToken);
+        break;
+      case kViewTreeHost_resetRoot_name:
+        var params = ViewTreeHostResetRootParams.deserialize(
+            message.payload);
+        _impl.resetRoot();
+        break;
+      case kViewTreeHost_layoutRoot_name:
+        var params = ViewTreeHostLayoutRootParams.deserialize(
+            message.payload);
+        var response = _impl.layoutRoot(params.rootLayoutParams,_ViewTreeHostLayoutRootResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kViewTreeHost_layoutRoot_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kViewTreeHost_layoutRoot_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  ViewTreeHost get impl => _impl;
+  set impl(ViewTreeHost d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "ViewTreeHostStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+
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
new file mode 100644
index 0000000..00a33d1
--- /dev/null
+++ b/mojo/dart/packages/mojo_services/lib/mojo/ui/views.mojom.dart
@@ -0,0 +1,1324 @@
+// 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.
+
+library views_mojom;
+
+import 'dart:async';
+
+import 'package:mojo/bindings.dart' as bindings;
+import 'package:mojo/core.dart' as core;
+import 'package:mojo/mojo/service_provider.mojom.dart' as service_provider_mojom;
+import 'package:mojo_services/mojo/ui/layouts.mojom.dart' as layouts_mojom;
+
+
+
+class ViewToken extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  int value = 0;
+
+  ViewToken() : super(kVersions.last.size);
+
+  static ViewToken deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ViewToken decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ViewToken result = new ViewToken();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.value = decoder0.decodeUint32(8);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeUint32(value, 8);
+  }
+
+  String toString() {
+    return "ViewToken("
+           "value: $value" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["value"] = value;
+    return map;
+  }
+}
+
+
+class ViewOnLayoutParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  layouts_mojom.ViewLayoutParams layoutParams = null;
+  List<int> childrenNeedingLayout = null;
+
+  ViewOnLayoutParams() : super(kVersions.last.size);
+
+  static ViewOnLayoutParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ViewOnLayoutParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ViewOnLayoutParams result = new ViewOnLayoutParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, false);
+      result.layoutParams = layouts_mojom.ViewLayoutParams.decode(decoder1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.childrenNeedingLayout = decoder0.decodeUint32Array(16, bindings.kNothingNullable, bindings.kUnspecifiedArrayLength);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(layoutParams, 8, false);
+    
+    encoder0.encodeUint32Array(childrenNeedingLayout, 16, bindings.kNothingNullable, bindings.kUnspecifiedArrayLength);
+  }
+
+  String toString() {
+    return "ViewOnLayoutParams("
+           "layoutParams: $layoutParams" ", "
+           "childrenNeedingLayout: $childrenNeedingLayout" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["layoutParams"] = layoutParams;
+    map["childrenNeedingLayout"] = childrenNeedingLayout;
+    return map;
+  }
+}
+
+
+class ViewOnLayoutResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  layouts_mojom.ViewLayoutInfo info = null;
+
+  ViewOnLayoutResponseParams() : super(kVersions.last.size);
+
+  static ViewOnLayoutResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ViewOnLayoutResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ViewOnLayoutResponseParams result = new ViewOnLayoutResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, false);
+      result.info = layouts_mojom.ViewLayoutInfo.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(info, 8, false);
+  }
+
+  String toString() {
+    return "ViewOnLayoutResponseParams("
+           "info: $info" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["info"] = info;
+    return map;
+  }
+}
+
+
+class ViewOnChildUnavailableParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  int childKey = 0;
+
+  ViewOnChildUnavailableParams() : super(kVersions.last.size);
+
+  static ViewOnChildUnavailableParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ViewOnChildUnavailableParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ViewOnChildUnavailableParams result = new ViewOnChildUnavailableParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.childKey = decoder0.decodeUint32(8);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeUint32(childKey, 8);
+  }
+
+  String toString() {
+    return "ViewOnChildUnavailableParams("
+           "childKey: $childKey" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["childKey"] = childKey;
+    return map;
+  }
+}
+
+
+class ViewOnChildUnavailableResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(8, 0)
+  ];
+
+  ViewOnChildUnavailableResponseParams() : super(kVersions.last.size);
+
+  static ViewOnChildUnavailableResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ViewOnChildUnavailableResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ViewOnChildUnavailableResponseParams result = new ViewOnChildUnavailableResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    encoder.getStructEncoderAtOffset(kVersions.last);
+  }
+
+  String toString() {
+    return "ViewOnChildUnavailableResponseParams("")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    return map;
+  }
+}
+
+
+class ViewHostGetServiceProviderParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  Object serviceProvider = null;
+
+  ViewHostGetServiceProviderParams() : super(kVersions.last.size);
+
+  static ViewHostGetServiceProviderParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ViewHostGetServiceProviderParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ViewHostGetServiceProviderParams result = new ViewHostGetServiceProviderParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.serviceProvider = decoder0.decodeInterfaceRequest(8, false, service_provider_mojom.ServiceProviderStub.newFromEndpoint);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeInterfaceRequest(serviceProvider, 8, false);
+  }
+
+  String toString() {
+    return "ViewHostGetServiceProviderParams("
+           "serviceProvider: $serviceProvider" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+
+class ViewHostRequestLayoutParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(8, 0)
+  ];
+
+  ViewHostRequestLayoutParams() : super(kVersions.last.size);
+
+  static ViewHostRequestLayoutParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ViewHostRequestLayoutParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ViewHostRequestLayoutParams result = new ViewHostRequestLayoutParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    encoder.getStructEncoderAtOffset(kVersions.last);
+  }
+
+  String toString() {
+    return "ViewHostRequestLayoutParams("")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    return map;
+  }
+}
+
+
+class ViewHostAddChildParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  int childKey = 0;
+  ViewToken childViewToken = null;
+
+  ViewHostAddChildParams() : super(kVersions.last.size);
+
+  static ViewHostAddChildParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ViewHostAddChildParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ViewHostAddChildParams result = new ViewHostAddChildParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.childKey = decoder0.decodeUint32(8);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(16, false);
+      result.childViewToken = ViewToken.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeUint32(childKey, 8);
+    
+    encoder0.encodeStruct(childViewToken, 16, false);
+  }
+
+  String toString() {
+    return "ViewHostAddChildParams("
+           "childKey: $childKey" ", "
+           "childViewToken: $childViewToken" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["childKey"] = childKey;
+    map["childViewToken"] = childViewToken;
+    return map;
+  }
+}
+
+
+class ViewHostRemoveChildParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  int childKey = 0;
+
+  ViewHostRemoveChildParams() : super(kVersions.last.size);
+
+  static ViewHostRemoveChildParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ViewHostRemoveChildParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ViewHostRemoveChildParams result = new ViewHostRemoveChildParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.childKey = decoder0.decodeUint32(8);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeUint32(childKey, 8);
+  }
+
+  String toString() {
+    return "ViewHostRemoveChildParams("
+           "childKey: $childKey" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["childKey"] = childKey;
+    return map;
+  }
+}
+
+
+class ViewHostLayoutChildParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  int childKey = 0;
+  layouts_mojom.ViewLayoutParams childLayoutParams = null;
+
+  ViewHostLayoutChildParams() : super(kVersions.last.size);
+
+  static ViewHostLayoutChildParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ViewHostLayoutChildParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ViewHostLayoutChildParams result = new ViewHostLayoutChildParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.childKey = decoder0.decodeUint32(8);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(16, false);
+      result.childLayoutParams = layouts_mojom.ViewLayoutParams.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeUint32(childKey, 8);
+    
+    encoder0.encodeStruct(childLayoutParams, 16, false);
+  }
+
+  String toString() {
+    return "ViewHostLayoutChildParams("
+           "childKey: $childKey" ", "
+           "childLayoutParams: $childLayoutParams" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["childKey"] = childKey;
+    map["childLayoutParams"] = childLayoutParams;
+    return map;
+  }
+}
+
+
+class ViewHostLayoutChildResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  layouts_mojom.ViewLayoutInfo info = null;
+
+  ViewHostLayoutChildResponseParams() : super(kVersions.last.size);
+
+  static ViewHostLayoutChildResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ViewHostLayoutChildResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ViewHostLayoutChildResponseParams result = new ViewHostLayoutChildResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, true);
+      result.info = layouts_mojom.ViewLayoutInfo.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(info, 8, true);
+  }
+
+  String toString() {
+    return "ViewHostLayoutChildResponseParams("
+           "info: $info" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["info"] = info;
+    return map;
+  }
+}
+
+const int kView_onLayout_name = 0;
+const int kView_onChildUnavailable_name = 1;
+
+const String ViewName =
+      'mojo::ui::View';
+
+abstract class View {
+  dynamic onLayout(layouts_mojom.ViewLayoutParams layoutParams,List<int> childrenNeedingLayout,[Function responseFactory = null]);
+  dynamic onChildUnavailable(int childKey,[Function responseFactory = null]);
+
+}
+
+
+class ViewProxyImpl extends bindings.Proxy {
+  ViewProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  ViewProxyImpl.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);
+  }
+
+  String get name => ViewName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      case kView_onLayout_name:
+        var r = ViewOnLayoutResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      case kView_onChildUnavailable_name:
+        var r = ViewOnChildUnavailableResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "ViewProxyImpl($superString)";
+  }
+}
+
+
+class _ViewProxyCalls implements View {
+  ViewProxyImpl _proxyImpl;
+
+  _ViewProxyCalls(this._proxyImpl);
+    dynamic onLayout(layouts_mojom.ViewLayoutParams layoutParams,List<int> childrenNeedingLayout,[Function responseFactory = null]) {
+      var params = new ViewOnLayoutParams();
+      params.layoutParams = layoutParams;
+      params.childrenNeedingLayout = childrenNeedingLayout;
+      return _proxyImpl.sendMessageWithRequestId(
+          params,
+          kView_onLayout_name,
+          -1,
+          bindings.MessageHeader.kMessageExpectsResponse);
+    }
+    dynamic onChildUnavailable(int childKey,[Function responseFactory = null]) {
+      var params = new ViewOnChildUnavailableParams();
+      params.childKey = childKey;
+      return _proxyImpl.sendMessageWithRequestId(
+          params,
+          kView_onChildUnavailable_name,
+          -1,
+          bindings.MessageHeader.kMessageExpectsResponse);
+    }
+}
+
+
+class ViewProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  View ptr;
+  final String name = ViewName;
+
+  ViewProxy(ViewProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _ViewProxyCalls(proxyImpl);
+
+  ViewProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new ViewProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _ViewProxyCalls(impl);
+  }
+
+  ViewProxy.fromHandle(core.MojoHandle handle) :
+      impl = new ViewProxyImpl.fromHandle(handle) {
+    ptr = new _ViewProxyCalls(impl);
+  }
+
+  ViewProxy.unbound() :
+      impl = new ViewProxyImpl.unbound() {
+    ptr = new _ViewProxyCalls(impl);
+  }
+
+  factory ViewProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    ViewProxy p = new ViewProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static ViewProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ViewProxy"));
+    return new ViewProxy.fromEndpoint(endpoint);
+  }
+
+  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 "ViewProxy($impl)";
+  }
+}
+
+
+class ViewStub extends bindings.Stub {
+  View _impl = null;
+
+  ViewStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  ViewStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  ViewStub.unbound() : super.unbound();
+
+  static ViewStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ViewStub"));
+    return new ViewStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = ViewName;
+
+
+  ViewOnLayoutResponseParams _ViewOnLayoutResponseParamsFactory(layouts_mojom.ViewLayoutInfo info) {
+    var result = new ViewOnLayoutResponseParams();
+    result.info = info;
+    return result;
+  }
+  ViewOnChildUnavailableResponseParams _ViewOnChildUnavailableResponseParamsFactory() {
+    var result = new ViewOnChildUnavailableResponseParams();
+    return result;
+  }
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      case kView_onLayout_name:
+        var params = ViewOnLayoutParams.deserialize(
+            message.payload);
+        var response = _impl.onLayout(params.layoutParams,params.childrenNeedingLayout,_ViewOnLayoutResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kView_onLayout_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kView_onLayout_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      case kView_onChildUnavailable_name:
+        var params = ViewOnChildUnavailableParams.deserialize(
+            message.payload);
+        var response = _impl.onChildUnavailable(params.childKey,_ViewOnChildUnavailableResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kView_onChildUnavailable_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kView_onChildUnavailable_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  View get impl => _impl;
+  set impl(View d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "ViewStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+const int kViewHost_getServiceProvider_name = 0;
+const int kViewHost_requestLayout_name = 1;
+const int kViewHost_addChild_name = 2;
+const int kViewHost_removeChild_name = 3;
+const int kViewHost_layoutChild_name = 4;
+
+const String ViewHostName =
+      'mojo::ui::ViewHost';
+
+abstract class ViewHost {
+  void getServiceProvider(Object serviceProvider);
+  void requestLayout();
+  void addChild(int childKey, ViewToken childViewToken);
+  void removeChild(int childKey);
+  dynamic layoutChild(int childKey,layouts_mojom.ViewLayoutParams childLayoutParams,[Function responseFactory = null]);
+
+}
+
+
+class ViewHostProxyImpl extends bindings.Proxy {
+  ViewHostProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  ViewHostProxyImpl.fromHandle(core.MojoHandle handle) :
+      super.fromHandle(handle);
+
+  ViewHostProxyImpl.unbound() : super.unbound();
+
+  static ViewHostProxyImpl newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ViewHostProxyImpl"));
+    return new ViewHostProxyImpl.fromEndpoint(endpoint);
+  }
+
+  String get name => ViewHostName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      case kViewHost_layoutChild_name:
+        var r = ViewHostLayoutChildResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "ViewHostProxyImpl($superString)";
+  }
+}
+
+
+class _ViewHostProxyCalls implements ViewHost {
+  ViewHostProxyImpl _proxyImpl;
+
+  _ViewHostProxyCalls(this._proxyImpl);
+    void getServiceProvider(Object serviceProvider) {
+      if (!_proxyImpl.isBound) {
+        _proxyImpl.proxyError("The Proxy is closed.");
+        return;
+      }
+      var params = new ViewHostGetServiceProviderParams();
+      params.serviceProvider = serviceProvider;
+      _proxyImpl.sendMessage(params, kViewHost_getServiceProvider_name);
+    }
+  
+    void requestLayout() {
+      if (!_proxyImpl.isBound) {
+        _proxyImpl.proxyError("The Proxy is closed.");
+        return;
+      }
+      var params = new ViewHostRequestLayoutParams();
+      _proxyImpl.sendMessage(params, kViewHost_requestLayout_name);
+    }
+  
+    void addChild(int childKey, ViewToken childViewToken) {
+      if (!_proxyImpl.isBound) {
+        _proxyImpl.proxyError("The Proxy is closed.");
+        return;
+      }
+      var params = new ViewHostAddChildParams();
+      params.childKey = childKey;
+      params.childViewToken = childViewToken;
+      _proxyImpl.sendMessage(params, kViewHost_addChild_name);
+    }
+  
+    void removeChild(int childKey) {
+      if (!_proxyImpl.isBound) {
+        _proxyImpl.proxyError("The Proxy is closed.");
+        return;
+      }
+      var params = new ViewHostRemoveChildParams();
+      params.childKey = childKey;
+      _proxyImpl.sendMessage(params, kViewHost_removeChild_name);
+    }
+  
+    dynamic layoutChild(int childKey,layouts_mojom.ViewLayoutParams childLayoutParams,[Function responseFactory = null]) {
+      var params = new ViewHostLayoutChildParams();
+      params.childKey = childKey;
+      params.childLayoutParams = childLayoutParams;
+      return _proxyImpl.sendMessageWithRequestId(
+          params,
+          kViewHost_layoutChild_name,
+          -1,
+          bindings.MessageHeader.kMessageExpectsResponse);
+    }
+}
+
+
+class ViewHostProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  ViewHost ptr;
+  final String name = ViewHostName;
+
+  ViewHostProxy(ViewHostProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _ViewHostProxyCalls(proxyImpl);
+
+  ViewHostProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new ViewHostProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _ViewHostProxyCalls(impl);
+  }
+
+  ViewHostProxy.fromHandle(core.MojoHandle handle) :
+      impl = new ViewHostProxyImpl.fromHandle(handle) {
+    ptr = new _ViewHostProxyCalls(impl);
+  }
+
+  ViewHostProxy.unbound() :
+      impl = new ViewHostProxyImpl.unbound() {
+    ptr = new _ViewHostProxyCalls(impl);
+  }
+
+  factory ViewHostProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    ViewHostProxy p = new ViewHostProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static ViewHostProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ViewHostProxy"));
+    return new ViewHostProxy.fromEndpoint(endpoint);
+  }
+
+  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 "ViewHostProxy($impl)";
+  }
+}
+
+
+class ViewHostStub extends bindings.Stub {
+  ViewHost _impl = null;
+
+  ViewHostStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  ViewHostStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  ViewHostStub.unbound() : super.unbound();
+
+  static ViewHostStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ViewHostStub"));
+    return new ViewHostStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = ViewHostName;
+
+
+  ViewHostLayoutChildResponseParams _ViewHostLayoutChildResponseParamsFactory(layouts_mojom.ViewLayoutInfo info) {
+    var result = new ViewHostLayoutChildResponseParams();
+    result.info = info;
+    return result;
+  }
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      case kViewHost_getServiceProvider_name:
+        var params = ViewHostGetServiceProviderParams.deserialize(
+            message.payload);
+        _impl.getServiceProvider(params.serviceProvider);
+        break;
+      case kViewHost_requestLayout_name:
+        var params = ViewHostRequestLayoutParams.deserialize(
+            message.payload);
+        _impl.requestLayout();
+        break;
+      case kViewHost_addChild_name:
+        var params = ViewHostAddChildParams.deserialize(
+            message.payload);
+        _impl.addChild(params.childKey, params.childViewToken);
+        break;
+      case kViewHost_removeChild_name:
+        var params = ViewHostRemoveChildParams.deserialize(
+            message.payload);
+        _impl.removeChild(params.childKey);
+        break;
+      case kViewHost_layoutChild_name:
+        var params = ViewHostLayoutChildParams.deserialize(
+            message.payload);
+        var response = _impl.layoutChild(params.childKey,params.childLayoutParams,_ViewHostLayoutChildResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kViewHost_layoutChild_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kViewHost_layoutChild_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  ViewHost get impl => _impl;
+  set impl(ViewHost d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "ViewHostStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+
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
new file mode 100644
index 0000000..0fc15ee
--- /dev/null
+++ b/mojo/dart/packages/mojo_services/lib/mojo/url_loader.mojom.dart
@@ -0,0 +1,808 @@
+// 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.
+
+library url_loader_mojom;
+
+import 'dart:async';
+
+import 'package:mojo/bindings.dart' as bindings;
+import 'package:mojo/core.dart' as core;
+import 'package:mojo/mojo/network_error.mojom.dart' as network_error_mojom;
+import 'package:mojo/mojo/url_request.mojom.dart' as url_request_mojom;
+import 'package:mojo/mojo/url_response.mojom.dart' as url_response_mojom;
+
+
+
+class UrlLoaderStatus extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  network_error_mojom.NetworkError error = null;
+  bool isLoading = false;
+
+  UrlLoaderStatus() : super(kVersions.last.size);
+
+  static UrlLoaderStatus deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static UrlLoaderStatus decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    UrlLoaderStatus result = new UrlLoaderStatus();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, true);
+      result.error = network_error_mojom.NetworkError.decode(decoder1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.isLoading = decoder0.decodeBool(16, 0);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(error, 8, true);
+    
+    encoder0.encodeBool(isLoading, 16, 0);
+  }
+
+  String toString() {
+    return "UrlLoaderStatus("
+           "error: $error" ", "
+           "isLoading: $isLoading" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["error"] = error;
+    map["isLoading"] = isLoading;
+    return map;
+  }
+}
+
+
+class UrlLoaderStartParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  url_request_mojom.UrlRequest request = null;
+
+  UrlLoaderStartParams() : super(kVersions.last.size);
+
+  static UrlLoaderStartParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static UrlLoaderStartParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    UrlLoaderStartParams result = new UrlLoaderStartParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, false);
+      result.request = url_request_mojom.UrlRequest.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(request, 8, false);
+  }
+
+  String toString() {
+    return "UrlLoaderStartParams("
+           "request: $request" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+
+class UrlLoaderStartResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  url_response_mojom.UrlResponse response = null;
+
+  UrlLoaderStartResponseParams() : super(kVersions.last.size);
+
+  static UrlLoaderStartResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static UrlLoaderStartResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    UrlLoaderStartResponseParams result = new UrlLoaderStartResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, false);
+      result.response = url_response_mojom.UrlResponse.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(response, 8, false);
+  }
+
+  String toString() {
+    return "UrlLoaderStartResponseParams("
+           "response: $response" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+
+class UrlLoaderFollowRedirectParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(8, 0)
+  ];
+
+  UrlLoaderFollowRedirectParams() : super(kVersions.last.size);
+
+  static UrlLoaderFollowRedirectParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static UrlLoaderFollowRedirectParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    UrlLoaderFollowRedirectParams result = new UrlLoaderFollowRedirectParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    encoder.getStructEncoderAtOffset(kVersions.last);
+  }
+
+  String toString() {
+    return "UrlLoaderFollowRedirectParams("")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    return map;
+  }
+}
+
+
+class UrlLoaderFollowRedirectResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  url_response_mojom.UrlResponse response = null;
+
+  UrlLoaderFollowRedirectResponseParams() : super(kVersions.last.size);
+
+  static UrlLoaderFollowRedirectResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static UrlLoaderFollowRedirectResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    UrlLoaderFollowRedirectResponseParams result = new UrlLoaderFollowRedirectResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, false);
+      result.response = url_response_mojom.UrlResponse.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(response, 8, false);
+  }
+
+  String toString() {
+    return "UrlLoaderFollowRedirectResponseParams("
+           "response: $response" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+
+class UrlLoaderQueryStatusParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(8, 0)
+  ];
+
+  UrlLoaderQueryStatusParams() : super(kVersions.last.size);
+
+  static UrlLoaderQueryStatusParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static UrlLoaderQueryStatusParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    UrlLoaderQueryStatusParams result = new UrlLoaderQueryStatusParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    encoder.getStructEncoderAtOffset(kVersions.last);
+  }
+
+  String toString() {
+    return "UrlLoaderQueryStatusParams("")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    return map;
+  }
+}
+
+
+class UrlLoaderQueryStatusResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  UrlLoaderStatus status = null;
+
+  UrlLoaderQueryStatusResponseParams() : super(kVersions.last.size);
+
+  static UrlLoaderQueryStatusResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static UrlLoaderQueryStatusResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    UrlLoaderQueryStatusResponseParams result = new UrlLoaderQueryStatusResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, false);
+      result.status = UrlLoaderStatus.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(status, 8, false);
+  }
+
+  String toString() {
+    return "UrlLoaderQueryStatusResponseParams("
+           "status: $status" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["status"] = status;
+    return map;
+  }
+}
+
+const int kUrlLoader_start_name = 0;
+const int kUrlLoader_followRedirect_name = 1;
+const int kUrlLoader_queryStatus_name = 2;
+
+const String UrlLoaderName =
+      'mojo::URLLoader';
+
+abstract class UrlLoader {
+  dynamic start(url_request_mojom.UrlRequest request,[Function responseFactory = null]);
+  dynamic followRedirect([Function responseFactory = null]);
+  dynamic queryStatus([Function responseFactory = null]);
+
+}
+
+
+class UrlLoaderProxyImpl extends bindings.Proxy {
+  UrlLoaderProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  UrlLoaderProxyImpl.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);
+  }
+
+  String get name => UrlLoaderName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      case kUrlLoader_start_name:
+        var r = UrlLoaderStartResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      case kUrlLoader_followRedirect_name:
+        var r = UrlLoaderFollowRedirectResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      case kUrlLoader_queryStatus_name:
+        var r = UrlLoaderQueryStatusResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "UrlLoaderProxyImpl($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,
+          kUrlLoader_start_name,
+          -1,
+          bindings.MessageHeader.kMessageExpectsResponse);
+    }
+    dynamic followRedirect([Function responseFactory = null]) {
+      var params = new UrlLoaderFollowRedirectParams();
+      return _proxyImpl.sendMessageWithRequestId(
+          params,
+          kUrlLoader_followRedirect_name,
+          -1,
+          bindings.MessageHeader.kMessageExpectsResponse);
+    }
+    dynamic queryStatus([Function responseFactory = null]) {
+      var params = new UrlLoaderQueryStatusParams();
+      return _proxyImpl.sendMessageWithRequestId(
+          params,
+          kUrlLoader_queryStatus_name,
+          -1,
+          bindings.MessageHeader.kMessageExpectsResponse);
+    }
+}
+
+
+class UrlLoaderProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  UrlLoader ptr;
+  final String name = UrlLoaderName;
+
+  UrlLoaderProxy(UrlLoaderProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _UrlLoaderProxyCalls(proxyImpl);
+
+  UrlLoaderProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new UrlLoaderProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _UrlLoaderProxyCalls(impl);
+  }
+
+  UrlLoaderProxy.fromHandle(core.MojoHandle handle) :
+      impl = new UrlLoaderProxyImpl.fromHandle(handle) {
+    ptr = new _UrlLoaderProxyCalls(impl);
+  }
+
+  UrlLoaderProxy.unbound() :
+      impl = new UrlLoaderProxyImpl.unbound() {
+    ptr = new _UrlLoaderProxyCalls(impl);
+  }
+
+  factory UrlLoaderProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    UrlLoaderProxy p = new UrlLoaderProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static UrlLoaderProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For UrlLoaderProxy"));
+    return new UrlLoaderProxy.fromEndpoint(endpoint);
+  }
+
+  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 "UrlLoaderProxy($impl)";
+  }
+}
+
+
+class UrlLoaderStub extends bindings.Stub {
+  UrlLoader _impl = null;
+
+  UrlLoaderStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  UrlLoaderStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  UrlLoaderStub.unbound() : super.unbound();
+
+  static UrlLoaderStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For UrlLoaderStub"));
+    return new UrlLoaderStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = UrlLoaderName;
+
+
+  UrlLoaderStartResponseParams _UrlLoaderStartResponseParamsFactory(url_response_mojom.UrlResponse response) {
+    var result = new UrlLoaderStartResponseParams();
+    result.response = response;
+    return result;
+  }
+  UrlLoaderFollowRedirectResponseParams _UrlLoaderFollowRedirectResponseParamsFactory(url_response_mojom.UrlResponse response) {
+    var result = new UrlLoaderFollowRedirectResponseParams();
+    result.response = response;
+    return result;
+  }
+  UrlLoaderQueryStatusResponseParams _UrlLoaderQueryStatusResponseParamsFactory(UrlLoaderStatus status) {
+    var result = new UrlLoaderQueryStatusResponseParams();
+    result.status = status;
+    return result;
+  }
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      case kUrlLoader_start_name:
+        var params = UrlLoaderStartParams.deserialize(
+            message.payload);
+        var response = _impl.start(params.request,_UrlLoaderStartResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kUrlLoader_start_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kUrlLoader_start_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      case kUrlLoader_followRedirect_name:
+        var params = UrlLoaderFollowRedirectParams.deserialize(
+            message.payload);
+        var response = _impl.followRedirect(_UrlLoaderFollowRedirectResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kUrlLoader_followRedirect_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kUrlLoader_followRedirect_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      case kUrlLoader_queryStatus_name:
+        var params = UrlLoaderQueryStatusParams.deserialize(
+            message.payload);
+        var response = _impl.queryStatus(_UrlLoaderQueryStatusResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kUrlLoader_queryStatus_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kUrlLoader_queryStatus_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  UrlLoader get impl => _impl;
+  set impl(UrlLoader d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "UrlLoaderStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+
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
new file mode 100644
index 0000000..a98f3a3
--- /dev/null
+++ b/mojo/dart/packages/mojo_services/lib/mojo/url_loader_interceptor.mojom.dart
@@ -0,0 +1,1056 @@
+// 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.
+
+library url_loader_interceptor_mojom;
+
+import 'dart:async';
+
+import 'package:mojo/bindings.dart' as bindings;
+import 'package:mojo/core.dart' as core;
+import 'package:mojo/mojo/url_request.mojom.dart' as url_request_mojom;
+import 'package:mojo/mojo/url_response.mojom.dart' as url_response_mojom;
+
+
+
+class UrlLoaderInterceptorResponse extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  url_request_mojom.UrlRequest request = null;
+  url_response_mojom.UrlResponse response = null;
+
+  UrlLoaderInterceptorResponse() : super(kVersions.last.size);
+
+  static UrlLoaderInterceptorResponse deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static UrlLoaderInterceptorResponse decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    UrlLoaderInterceptorResponse result = new UrlLoaderInterceptorResponse();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, true);
+      result.request = url_request_mojom.UrlRequest.decode(decoder1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(16, true);
+      result.response = url_response_mojom.UrlResponse.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(request, 8, true);
+    
+    encoder0.encodeStruct(response, 16, true);
+  }
+
+  String toString() {
+    return "UrlLoaderInterceptorResponse("
+           "request: $request" ", "
+           "response: $response" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+
+class UrlLoaderInterceptorFactoryCreateParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  Object interceptor = null;
+
+  UrlLoaderInterceptorFactoryCreateParams() : super(kVersions.last.size);
+
+  static UrlLoaderInterceptorFactoryCreateParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static UrlLoaderInterceptorFactoryCreateParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    UrlLoaderInterceptorFactoryCreateParams result = new UrlLoaderInterceptorFactoryCreateParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.interceptor = decoder0.decodeInterfaceRequest(8, false, UrlLoaderInterceptorStub.newFromEndpoint);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeInterfaceRequest(interceptor, 8, false);
+  }
+
+  String toString() {
+    return "UrlLoaderInterceptorFactoryCreateParams("
+           "interceptor: $interceptor" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+
+class UrlLoaderInterceptorInterceptRequestParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  url_request_mojom.UrlRequest request = null;
+
+  UrlLoaderInterceptorInterceptRequestParams() : super(kVersions.last.size);
+
+  static UrlLoaderInterceptorInterceptRequestParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static UrlLoaderInterceptorInterceptRequestParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    UrlLoaderInterceptorInterceptRequestParams result = new UrlLoaderInterceptorInterceptRequestParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, false);
+      result.request = url_request_mojom.UrlRequest.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(request, 8, false);
+  }
+
+  String toString() {
+    return "UrlLoaderInterceptorInterceptRequestParams("
+           "request: $request" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+
+class UrlLoaderInterceptorInterceptRequestResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  UrlLoaderInterceptorResponse response = null;
+
+  UrlLoaderInterceptorInterceptRequestResponseParams() : super(kVersions.last.size);
+
+  static UrlLoaderInterceptorInterceptRequestResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static UrlLoaderInterceptorInterceptRequestResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    UrlLoaderInterceptorInterceptRequestResponseParams result = new UrlLoaderInterceptorInterceptRequestResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, false);
+      result.response = UrlLoaderInterceptorResponse.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(response, 8, false);
+  }
+
+  String toString() {
+    return "UrlLoaderInterceptorInterceptRequestResponseParams("
+           "response: $response" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+
+class UrlLoaderInterceptorInterceptFollowRedirectParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(8, 0)
+  ];
+
+  UrlLoaderInterceptorInterceptFollowRedirectParams() : super(kVersions.last.size);
+
+  static UrlLoaderInterceptorInterceptFollowRedirectParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static UrlLoaderInterceptorInterceptFollowRedirectParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    UrlLoaderInterceptorInterceptFollowRedirectParams result = new UrlLoaderInterceptorInterceptFollowRedirectParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    encoder.getStructEncoderAtOffset(kVersions.last);
+  }
+
+  String toString() {
+    return "UrlLoaderInterceptorInterceptFollowRedirectParams("")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    return map;
+  }
+}
+
+
+class UrlLoaderInterceptorInterceptFollowRedirectResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  UrlLoaderInterceptorResponse response = null;
+
+  UrlLoaderInterceptorInterceptFollowRedirectResponseParams() : super(kVersions.last.size);
+
+  static UrlLoaderInterceptorInterceptFollowRedirectResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static UrlLoaderInterceptorInterceptFollowRedirectResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    UrlLoaderInterceptorInterceptFollowRedirectResponseParams result = new UrlLoaderInterceptorInterceptFollowRedirectResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, true);
+      result.response = UrlLoaderInterceptorResponse.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(response, 8, true);
+  }
+
+  String toString() {
+    return "UrlLoaderInterceptorInterceptFollowRedirectResponseParams("
+           "response: $response" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+
+class UrlLoaderInterceptorInterceptResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  url_response_mojom.UrlResponse response = null;
+
+  UrlLoaderInterceptorInterceptResponseParams() : super(kVersions.last.size);
+
+  static UrlLoaderInterceptorInterceptResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static UrlLoaderInterceptorInterceptResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    UrlLoaderInterceptorInterceptResponseParams result = new UrlLoaderInterceptorInterceptResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, false);
+      result.response = url_response_mojom.UrlResponse.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(response, 8, false);
+  }
+
+  String toString() {
+    return "UrlLoaderInterceptorInterceptResponseParams("
+           "response: $response" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+
+class UrlLoaderInterceptorInterceptResponseResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  UrlLoaderInterceptorResponse response = null;
+
+  UrlLoaderInterceptorInterceptResponseResponseParams() : super(kVersions.last.size);
+
+  static UrlLoaderInterceptorInterceptResponseResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static UrlLoaderInterceptorInterceptResponseResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    UrlLoaderInterceptorInterceptResponseResponseParams result = new UrlLoaderInterceptorInterceptResponseResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, true);
+      result.response = UrlLoaderInterceptorResponse.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(response, 8, true);
+  }
+
+  String toString() {
+    return "UrlLoaderInterceptorInterceptResponseResponseParams("
+           "response: $response" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+const int kUrlLoaderInterceptorFactory_create_name = 0;
+
+const String UrlLoaderInterceptorFactoryName =
+      'mojo::URLLoaderInterceptorFactory';
+
+abstract class UrlLoaderInterceptorFactory {
+  void create(Object interceptor);
+
+}
+
+
+class UrlLoaderInterceptorFactoryProxyImpl extends bindings.Proxy {
+  UrlLoaderInterceptorFactoryProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  UrlLoaderInterceptorFactoryProxyImpl.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);
+  }
+
+  String get name => UrlLoaderInterceptorFactoryName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "UrlLoaderInterceptorFactoryProxyImpl($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, kUrlLoaderInterceptorFactory_create_name);
+    }
+  
+}
+
+
+class UrlLoaderInterceptorFactoryProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  UrlLoaderInterceptorFactory ptr;
+  final String name = UrlLoaderInterceptorFactoryName;
+
+  UrlLoaderInterceptorFactoryProxy(UrlLoaderInterceptorFactoryProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _UrlLoaderInterceptorFactoryProxyCalls(proxyImpl);
+
+  UrlLoaderInterceptorFactoryProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new UrlLoaderInterceptorFactoryProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _UrlLoaderInterceptorFactoryProxyCalls(impl);
+  }
+
+  UrlLoaderInterceptorFactoryProxy.fromHandle(core.MojoHandle handle) :
+      impl = new UrlLoaderInterceptorFactoryProxyImpl.fromHandle(handle) {
+    ptr = new _UrlLoaderInterceptorFactoryProxyCalls(impl);
+  }
+
+  UrlLoaderInterceptorFactoryProxy.unbound() :
+      impl = new UrlLoaderInterceptorFactoryProxyImpl.unbound() {
+    ptr = new _UrlLoaderInterceptorFactoryProxyCalls(impl);
+  }
+
+  factory UrlLoaderInterceptorFactoryProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    UrlLoaderInterceptorFactoryProxy p = new UrlLoaderInterceptorFactoryProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static UrlLoaderInterceptorFactoryProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For UrlLoaderInterceptorFactoryProxy"));
+    return new UrlLoaderInterceptorFactoryProxy.fromEndpoint(endpoint);
+  }
+
+  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)";
+  }
+}
+
+
+class UrlLoaderInterceptorFactoryStub extends bindings.Stub {
+  UrlLoaderInterceptorFactory _impl = null;
+
+  UrlLoaderInterceptorFactoryStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  UrlLoaderInterceptorFactoryStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  UrlLoaderInterceptorFactoryStub.unbound() : super.unbound();
+
+  static UrlLoaderInterceptorFactoryStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For UrlLoaderInterceptorFactoryStub"));
+    return new UrlLoaderInterceptorFactoryStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = UrlLoaderInterceptorFactoryName;
+
+
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      case kUrlLoaderInterceptorFactory_create_name:
+        var params = UrlLoaderInterceptorFactoryCreateParams.deserialize(
+            message.payload);
+        _impl.create(params.interceptor);
+        break;
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  UrlLoaderInterceptorFactory get impl => _impl;
+  set impl(UrlLoaderInterceptorFactory d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "UrlLoaderInterceptorFactoryStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+const int kUrlLoaderInterceptor_interceptRequest_name = 0;
+const int kUrlLoaderInterceptor_interceptFollowRedirect_name = 1;
+const int kUrlLoaderInterceptor_interceptResponse_name = 2;
+
+const String UrlLoaderInterceptorName =
+      'mojo::URLLoaderInterceptor';
+
+abstract class UrlLoaderInterceptor {
+  dynamic interceptRequest(url_request_mojom.UrlRequest request,[Function responseFactory = null]);
+  dynamic interceptFollowRedirect([Function responseFactory = null]);
+  dynamic interceptResponse(url_response_mojom.UrlResponse response,[Function responseFactory = null]);
+
+}
+
+
+class UrlLoaderInterceptorProxyImpl extends bindings.Proxy {
+  UrlLoaderInterceptorProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  UrlLoaderInterceptorProxyImpl.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);
+  }
+
+  String get name => UrlLoaderInterceptorName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      case kUrlLoaderInterceptor_interceptRequest_name:
+        var r = UrlLoaderInterceptorInterceptRequestResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      case kUrlLoaderInterceptor_interceptFollowRedirect_name:
+        var r = UrlLoaderInterceptorInterceptFollowRedirectResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      case kUrlLoaderInterceptor_interceptResponse_name:
+        var r = UrlLoaderInterceptorInterceptResponseResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "UrlLoaderInterceptorProxyImpl($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,
+          kUrlLoaderInterceptor_interceptRequest_name,
+          -1,
+          bindings.MessageHeader.kMessageExpectsResponse);
+    }
+    dynamic interceptFollowRedirect([Function responseFactory = null]) {
+      var params = new UrlLoaderInterceptorInterceptFollowRedirectParams();
+      return _proxyImpl.sendMessageWithRequestId(
+          params,
+          kUrlLoaderInterceptor_interceptFollowRedirect_name,
+          -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,
+          kUrlLoaderInterceptor_interceptResponse_name,
+          -1,
+          bindings.MessageHeader.kMessageExpectsResponse);
+    }
+}
+
+
+class UrlLoaderInterceptorProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  UrlLoaderInterceptor ptr;
+  final String name = UrlLoaderInterceptorName;
+
+  UrlLoaderInterceptorProxy(UrlLoaderInterceptorProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _UrlLoaderInterceptorProxyCalls(proxyImpl);
+
+  UrlLoaderInterceptorProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new UrlLoaderInterceptorProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _UrlLoaderInterceptorProxyCalls(impl);
+  }
+
+  UrlLoaderInterceptorProxy.fromHandle(core.MojoHandle handle) :
+      impl = new UrlLoaderInterceptorProxyImpl.fromHandle(handle) {
+    ptr = new _UrlLoaderInterceptorProxyCalls(impl);
+  }
+
+  UrlLoaderInterceptorProxy.unbound() :
+      impl = new UrlLoaderInterceptorProxyImpl.unbound() {
+    ptr = new _UrlLoaderInterceptorProxyCalls(impl);
+  }
+
+  factory UrlLoaderInterceptorProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    UrlLoaderInterceptorProxy p = new UrlLoaderInterceptorProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static UrlLoaderInterceptorProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For UrlLoaderInterceptorProxy"));
+    return new UrlLoaderInterceptorProxy.fromEndpoint(endpoint);
+  }
+
+  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 "UrlLoaderInterceptorProxy($impl)";
+  }
+}
+
+
+class UrlLoaderInterceptorStub extends bindings.Stub {
+  UrlLoaderInterceptor _impl = null;
+
+  UrlLoaderInterceptorStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  UrlLoaderInterceptorStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  UrlLoaderInterceptorStub.unbound() : super.unbound();
+
+  static UrlLoaderInterceptorStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For UrlLoaderInterceptorStub"));
+    return new UrlLoaderInterceptorStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = UrlLoaderInterceptorName;
+
+
+  UrlLoaderInterceptorInterceptRequestResponseParams _UrlLoaderInterceptorInterceptRequestResponseParamsFactory(UrlLoaderInterceptorResponse response) {
+    var result = new UrlLoaderInterceptorInterceptRequestResponseParams();
+    result.response = response;
+    return result;
+  }
+  UrlLoaderInterceptorInterceptFollowRedirectResponseParams _UrlLoaderInterceptorInterceptFollowRedirectResponseParamsFactory(UrlLoaderInterceptorResponse response) {
+    var result = new UrlLoaderInterceptorInterceptFollowRedirectResponseParams();
+    result.response = response;
+    return result;
+  }
+  UrlLoaderInterceptorInterceptResponseResponseParams _UrlLoaderInterceptorInterceptResponseResponseParamsFactory(UrlLoaderInterceptorResponse response) {
+    var result = new UrlLoaderInterceptorInterceptResponseResponseParams();
+    result.response = response;
+    return result;
+  }
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      case kUrlLoaderInterceptor_interceptRequest_name:
+        var params = UrlLoaderInterceptorInterceptRequestParams.deserialize(
+            message.payload);
+        var response = _impl.interceptRequest(params.request,_UrlLoaderInterceptorInterceptRequestResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kUrlLoaderInterceptor_interceptRequest_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kUrlLoaderInterceptor_interceptRequest_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      case kUrlLoaderInterceptor_interceptFollowRedirect_name:
+        var params = UrlLoaderInterceptorInterceptFollowRedirectParams.deserialize(
+            message.payload);
+        var response = _impl.interceptFollowRedirect(_UrlLoaderInterceptorInterceptFollowRedirectResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kUrlLoaderInterceptor_interceptFollowRedirect_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kUrlLoaderInterceptor_interceptFollowRedirect_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      case kUrlLoaderInterceptor_interceptResponse_name:
+        var params = UrlLoaderInterceptorInterceptResponseParams.deserialize(
+            message.payload);
+        var response = _impl.interceptResponse(params.response,_UrlLoaderInterceptorInterceptResponseResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kUrlLoaderInterceptor_interceptResponse_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kUrlLoaderInterceptor_interceptResponse_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  UrlLoaderInterceptor get impl => _impl;
+  set impl(UrlLoaderInterceptor d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "UrlLoaderInterceptorStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+
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
new file mode 100644
index 0000000..a8d9a58
--- /dev/null
+++ b/mojo/dart/packages/mojo_services/lib/mojo/url_response_disk_cache.mojom.dart
@@ -0,0 +1,954 @@
+// 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.
+
+library url_response_disk_cache_mojom;
+
+import 'dart:async';
+
+import 'package:mojo/bindings.dart' as bindings;
+import 'package:mojo/core.dart' as core;
+import 'package:mojo/mojo/url_response.mojom.dart' as url_response_mojom;
+
+
+
+class UrlResponseDiskCacheGetParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  String url = null;
+
+  UrlResponseDiskCacheGetParams() : super(kVersions.last.size);
+
+  static UrlResponseDiskCacheGetParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static UrlResponseDiskCacheGetParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    UrlResponseDiskCacheGetParams result = new UrlResponseDiskCacheGetParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.url = decoder0.decodeString(8, false);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeString(url, 8, false);
+  }
+
+  String toString() {
+    return "UrlResponseDiskCacheGetParams("
+           "url: $url" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["url"] = url;
+    return map;
+  }
+}
+
+
+class UrlResponseDiskCacheGetResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(32, 0)
+  ];
+  url_response_mojom.UrlResponse response = null;
+  List<int> filePath = null;
+  List<int> cacheDirPath = null;
+
+  UrlResponseDiskCacheGetResponseParams() : super(kVersions.last.size);
+
+  static UrlResponseDiskCacheGetResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static UrlResponseDiskCacheGetResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    UrlResponseDiskCacheGetResponseParams result = new UrlResponseDiskCacheGetResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, true);
+      result.response = url_response_mojom.UrlResponse.decode(decoder1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.filePath = decoder0.decodeUint8Array(16, bindings.kArrayNullable, bindings.kUnspecifiedArrayLength);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.cacheDirPath = decoder0.decodeUint8Array(24, bindings.kArrayNullable, bindings.kUnspecifiedArrayLength);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(response, 8, true);
+    
+    encoder0.encodeUint8Array(filePath, 16, bindings.kArrayNullable, bindings.kUnspecifiedArrayLength);
+    
+    encoder0.encodeUint8Array(cacheDirPath, 24, bindings.kArrayNullable, bindings.kUnspecifiedArrayLength);
+  }
+
+  String toString() {
+    return "UrlResponseDiskCacheGetResponseParams("
+           "response: $response" ", "
+           "filePath: $filePath" ", "
+           "cacheDirPath: $cacheDirPath" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+
+class UrlResponseDiskCacheValidateParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  String url = null;
+
+  UrlResponseDiskCacheValidateParams() : super(kVersions.last.size);
+
+  static UrlResponseDiskCacheValidateParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static UrlResponseDiskCacheValidateParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    UrlResponseDiskCacheValidateParams result = new UrlResponseDiskCacheValidateParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.url = decoder0.decodeString(8, false);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeString(url, 8, false);
+  }
+
+  String toString() {
+    return "UrlResponseDiskCacheValidateParams("
+           "url: $url" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["url"] = url;
+    return map;
+  }
+}
+
+
+class UrlResponseDiskCacheUpdateParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  url_response_mojom.UrlResponse response = null;
+
+  UrlResponseDiskCacheUpdateParams() : super(kVersions.last.size);
+
+  static UrlResponseDiskCacheUpdateParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static UrlResponseDiskCacheUpdateParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    UrlResponseDiskCacheUpdateParams result = new UrlResponseDiskCacheUpdateParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, false);
+      result.response = url_response_mojom.UrlResponse.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(response, 8, false);
+  }
+
+  String toString() {
+    return "UrlResponseDiskCacheUpdateParams("
+           "response: $response" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+
+class UrlResponseDiskCacheUpdateAndGetParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  url_response_mojom.UrlResponse response = null;
+
+  UrlResponseDiskCacheUpdateAndGetParams() : super(kVersions.last.size);
+
+  static UrlResponseDiskCacheUpdateAndGetParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static UrlResponseDiskCacheUpdateAndGetParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    UrlResponseDiskCacheUpdateAndGetParams result = new UrlResponseDiskCacheUpdateAndGetParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, false);
+      result.response = url_response_mojom.UrlResponse.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(response, 8, false);
+  }
+
+  String toString() {
+    return "UrlResponseDiskCacheUpdateAndGetParams("
+           "response: $response" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+
+class UrlResponseDiskCacheUpdateAndGetResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  List<int> filePath = null;
+  List<int> cacheDirPath = null;
+
+  UrlResponseDiskCacheUpdateAndGetResponseParams() : super(kVersions.last.size);
+
+  static UrlResponseDiskCacheUpdateAndGetResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static UrlResponseDiskCacheUpdateAndGetResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    UrlResponseDiskCacheUpdateAndGetResponseParams result = new UrlResponseDiskCacheUpdateAndGetResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.filePath = decoder0.decodeUint8Array(8, bindings.kArrayNullable, bindings.kUnspecifiedArrayLength);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.cacheDirPath = decoder0.decodeUint8Array(16, bindings.kArrayNullable, bindings.kUnspecifiedArrayLength);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeUint8Array(filePath, 8, bindings.kArrayNullable, bindings.kUnspecifiedArrayLength);
+    
+    encoder0.encodeUint8Array(cacheDirPath, 16, bindings.kArrayNullable, bindings.kUnspecifiedArrayLength);
+  }
+
+  String toString() {
+    return "UrlResponseDiskCacheUpdateAndGetResponseParams("
+           "filePath: $filePath" ", "
+           "cacheDirPath: $cacheDirPath" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["filePath"] = filePath;
+    map["cacheDirPath"] = cacheDirPath;
+    return map;
+  }
+}
+
+
+class UrlResponseDiskCacheUpdateAndGetExtractedParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  url_response_mojom.UrlResponse response = null;
+
+  UrlResponseDiskCacheUpdateAndGetExtractedParams() : super(kVersions.last.size);
+
+  static UrlResponseDiskCacheUpdateAndGetExtractedParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static UrlResponseDiskCacheUpdateAndGetExtractedParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    UrlResponseDiskCacheUpdateAndGetExtractedParams result = new UrlResponseDiskCacheUpdateAndGetExtractedParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, false);
+      result.response = url_response_mojom.UrlResponse.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(response, 8, false);
+  }
+
+  String toString() {
+    return "UrlResponseDiskCacheUpdateAndGetExtractedParams("
+           "response: $response" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+
+class UrlResponseDiskCacheUpdateAndGetExtractedResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  List<int> extractedDirPath = null;
+  List<int> cacheDirPath = null;
+
+  UrlResponseDiskCacheUpdateAndGetExtractedResponseParams() : super(kVersions.last.size);
+
+  static UrlResponseDiskCacheUpdateAndGetExtractedResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static UrlResponseDiskCacheUpdateAndGetExtractedResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    UrlResponseDiskCacheUpdateAndGetExtractedResponseParams result = new UrlResponseDiskCacheUpdateAndGetExtractedResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.extractedDirPath = decoder0.decodeUint8Array(8, bindings.kArrayNullable, bindings.kUnspecifiedArrayLength);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.cacheDirPath = decoder0.decodeUint8Array(16, bindings.kArrayNullable, bindings.kUnspecifiedArrayLength);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeUint8Array(extractedDirPath, 8, bindings.kArrayNullable, bindings.kUnspecifiedArrayLength);
+    
+    encoder0.encodeUint8Array(cacheDirPath, 16, bindings.kArrayNullable, bindings.kUnspecifiedArrayLength);
+  }
+
+  String toString() {
+    return "UrlResponseDiskCacheUpdateAndGetExtractedResponseParams("
+           "extractedDirPath: $extractedDirPath" ", "
+           "cacheDirPath: $cacheDirPath" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["extractedDirPath"] = extractedDirPath;
+    map["cacheDirPath"] = cacheDirPath;
+    return map;
+  }
+}
+
+const int kUrlResponseDiskCache_get_name = 0;
+const int kUrlResponseDiskCache_validate_name = 1;
+const int kUrlResponseDiskCache_update_name = 2;
+const int kUrlResponseDiskCache_updateAndGet_name = 3;
+const int kUrlResponseDiskCache_updateAndGetExtracted_name = 4;
+
+const String UrlResponseDiskCacheName =
+      'mojo::URLResponseDiskCache';
+
+abstract class UrlResponseDiskCache {
+  dynamic get(String url,[Function responseFactory = null]);
+  void validate(String url);
+  void update(url_response_mojom.UrlResponse response);
+  dynamic updateAndGet(url_response_mojom.UrlResponse response,[Function responseFactory = null]);
+  dynamic updateAndGetExtracted(url_response_mojom.UrlResponse response,[Function responseFactory = null]);
+
+}
+
+
+class UrlResponseDiskCacheProxyImpl extends bindings.Proxy {
+  UrlResponseDiskCacheProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  UrlResponseDiskCacheProxyImpl.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);
+  }
+
+  String get name => UrlResponseDiskCacheName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      case kUrlResponseDiskCache_get_name:
+        var r = UrlResponseDiskCacheGetResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      case kUrlResponseDiskCache_updateAndGet_name:
+        var r = UrlResponseDiskCacheUpdateAndGetResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      case kUrlResponseDiskCache_updateAndGetExtracted_name:
+        var r = UrlResponseDiskCacheUpdateAndGetExtractedResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "UrlResponseDiskCacheProxyImpl($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,
+          kUrlResponseDiskCache_get_name,
+          -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, kUrlResponseDiskCache_validate_name);
+    }
+  
+    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, kUrlResponseDiskCache_update_name);
+    }
+  
+    dynamic updateAndGet(url_response_mojom.UrlResponse response,[Function responseFactory = null]) {
+      var params = new UrlResponseDiskCacheUpdateAndGetParams();
+      params.response = response;
+      return _proxyImpl.sendMessageWithRequestId(
+          params,
+          kUrlResponseDiskCache_updateAndGet_name,
+          -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,
+          kUrlResponseDiskCache_updateAndGetExtracted_name,
+          -1,
+          bindings.MessageHeader.kMessageExpectsResponse);
+    }
+}
+
+
+class UrlResponseDiskCacheProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  UrlResponseDiskCache ptr;
+  final String name = UrlResponseDiskCacheName;
+
+  UrlResponseDiskCacheProxy(UrlResponseDiskCacheProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _UrlResponseDiskCacheProxyCalls(proxyImpl);
+
+  UrlResponseDiskCacheProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new UrlResponseDiskCacheProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _UrlResponseDiskCacheProxyCalls(impl);
+  }
+
+  UrlResponseDiskCacheProxy.fromHandle(core.MojoHandle handle) :
+      impl = new UrlResponseDiskCacheProxyImpl.fromHandle(handle) {
+    ptr = new _UrlResponseDiskCacheProxyCalls(impl);
+  }
+
+  UrlResponseDiskCacheProxy.unbound() :
+      impl = new UrlResponseDiskCacheProxyImpl.unbound() {
+    ptr = new _UrlResponseDiskCacheProxyCalls(impl);
+  }
+
+  factory UrlResponseDiskCacheProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    UrlResponseDiskCacheProxy p = new UrlResponseDiskCacheProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static UrlResponseDiskCacheProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For UrlResponseDiskCacheProxy"));
+    return new UrlResponseDiskCacheProxy.fromEndpoint(endpoint);
+  }
+
+  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 "UrlResponseDiskCacheProxy($impl)";
+  }
+}
+
+
+class UrlResponseDiskCacheStub extends bindings.Stub {
+  UrlResponseDiskCache _impl = null;
+
+  UrlResponseDiskCacheStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  UrlResponseDiskCacheStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  UrlResponseDiskCacheStub.unbound() : super.unbound();
+
+  static UrlResponseDiskCacheStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For UrlResponseDiskCacheStub"));
+    return new UrlResponseDiskCacheStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = UrlResponseDiskCacheName;
+
+
+  UrlResponseDiskCacheGetResponseParams _UrlResponseDiskCacheGetResponseParamsFactory(url_response_mojom.UrlResponse response, List<int> filePath, List<int> cacheDirPath) {
+    var result = new UrlResponseDiskCacheGetResponseParams();
+    result.response = response;
+    result.filePath = filePath;
+    result.cacheDirPath = cacheDirPath;
+    return result;
+  }
+  UrlResponseDiskCacheUpdateAndGetResponseParams _UrlResponseDiskCacheUpdateAndGetResponseParamsFactory(List<int> filePath, List<int> cacheDirPath) {
+    var result = new UrlResponseDiskCacheUpdateAndGetResponseParams();
+    result.filePath = filePath;
+    result.cacheDirPath = cacheDirPath;
+    return result;
+  }
+  UrlResponseDiskCacheUpdateAndGetExtractedResponseParams _UrlResponseDiskCacheUpdateAndGetExtractedResponseParamsFactory(List<int> extractedDirPath, List<int> cacheDirPath) {
+    var result = new UrlResponseDiskCacheUpdateAndGetExtractedResponseParams();
+    result.extractedDirPath = extractedDirPath;
+    result.cacheDirPath = cacheDirPath;
+    return result;
+  }
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      case kUrlResponseDiskCache_get_name:
+        var params = UrlResponseDiskCacheGetParams.deserialize(
+            message.payload);
+        var response = _impl.get(params.url,_UrlResponseDiskCacheGetResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kUrlResponseDiskCache_get_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kUrlResponseDiskCache_get_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      case kUrlResponseDiskCache_validate_name:
+        var params = UrlResponseDiskCacheValidateParams.deserialize(
+            message.payload);
+        _impl.validate(params.url);
+        break;
+      case kUrlResponseDiskCache_update_name:
+        var params = UrlResponseDiskCacheUpdateParams.deserialize(
+            message.payload);
+        _impl.update(params.response);
+        break;
+      case kUrlResponseDiskCache_updateAndGet_name:
+        var params = UrlResponseDiskCacheUpdateAndGetParams.deserialize(
+            message.payload);
+        var response = _impl.updateAndGet(params.response,_UrlResponseDiskCacheUpdateAndGetResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kUrlResponseDiskCache_updateAndGet_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kUrlResponseDiskCache_updateAndGet_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      case kUrlResponseDiskCache_updateAndGetExtracted_name:
+        var params = UrlResponseDiskCacheUpdateAndGetExtractedParams.deserialize(
+            message.payload);
+        var response = _impl.updateAndGetExtracted(params.response,_UrlResponseDiskCacheUpdateAndGetExtractedResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kUrlResponseDiskCache_updateAndGetExtracted_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kUrlResponseDiskCache_updateAndGetExtracted_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  UrlResponseDiskCache get impl => _impl;
+  set impl(UrlResponseDiskCache d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "UrlResponseDiskCacheStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/view_manager.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/view_manager.mojom.dart
new file mode 100644
index 0000000..de0dbc6
--- /dev/null
+++ b/mojo/dart/packages/mojo_services/lib/mojo/view_manager.mojom.dart
@@ -0,0 +1,4649 @@
+// 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.
+
+library view_manager_mojom;
+
+import 'dart:async';
+
+import 'package:mojo/bindings.dart' as bindings;
+import 'package:mojo/core.dart' as core;
+import 'package:mojo_services/mojo/geometry.mojom.dart' as geometry_mojom;
+import 'package:mojo_services/mojo/input_events.mojom.dart' as input_events_mojom;
+import 'package:mojo/mojo/service_provider.mojom.dart' as service_provider_mojom;
+import 'package:mojo_services/mojo/native_viewport.mojom.dart' as native_viewport_mojom;
+import 'package:mojo_services/mojo/surface_id.mojom.dart' as surface_id_mojom;
+import 'package:mojo_services/mojo/view_manager_constants.mojom.dart' as view_manager_constants_mojom;
+class ErrorCode extends bindings.MojoEnum {
+  static const NONE = const ErrorCode._(0);
+  static const VALUE_IN_USE = const ErrorCode._(1);
+  static const ILLEGAL_ARGUMENT = const ErrorCode._(2);
+
+  const ErrorCode._(int v) : super(v);
+
+  static const Map<String, ErrorCode> valuesMap = const {
+    "NONE": NONE,
+    "VALUE_IN_USE": VALUE_IN_USE,
+    "ILLEGAL_ARGUMENT": ILLEGAL_ARGUMENT,
+  };
+  static const List<ErrorCode> values = const [
+    NONE,
+    VALUE_IN_USE,
+    ILLEGAL_ARGUMENT,
+  ];
+
+  static ErrorCode valueOf(String name) => valuesMap[name];
+
+  factory ErrorCode(int v) {
+    switch (v) {
+      case 0:
+        return NONE;
+      case 1:
+        return VALUE_IN_USE;
+      case 2:
+        return ILLEGAL_ARGUMENT;
+      default:
+        return null;
+    }
+  }
+
+  static ErrorCode decode(bindings.Decoder decoder0, int offset) {
+    int v = decoder0.decodeUint32(offset);
+    ErrorCode result = new ErrorCode(v);
+    if (result == null) {
+      throw new bindings.MojoCodecError(
+          'Bad value $v for enum ErrorCode.');
+    }
+    return result;
+  }
+
+  String toString() {
+    switch(this) {
+      case NONE:
+        return 'ErrorCode.NONE';
+      case VALUE_IN_USE:
+        return 'ErrorCode.VALUE_IN_USE';
+      case ILLEGAL_ARGUMENT:
+        return 'ErrorCode.ILLEGAL_ARGUMENT';
+    }
+  }
+
+  int toJson() => value;
+}
+
+
+
+class ViewData extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(48, 0)
+  ];
+  int parentId = 0;
+  int viewId = 0;
+  geometry_mojom.Rect bounds = null;
+  Map<String, List<int>> properties = null;
+  bool visible = false;
+  bool drawn = false;
+  native_viewport_mojom.ViewportMetrics viewportMetrics = null;
+
+  ViewData() : super(kVersions.last.size);
+
+  static ViewData deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ViewData decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ViewData result = new ViewData();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.parentId = decoder0.decodeUint32(8);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.viewId = decoder0.decodeUint32(12);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(16, false);
+      result.bounds = geometry_mojom.Rect.decode(decoder1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(24, false);
+      {
+        decoder1.decodeDataHeaderForMap();
+        List<String> keys0;
+        List<List<int>> values0;
+        {
+          
+          var decoder2 = decoder1.decodePointer(bindings.ArrayDataHeader.kHeaderSize, false);
+          {
+            var si2 = decoder2.decodeDataHeaderForPointerArray(bindings.kUnspecifiedArrayLength);
+            keys0 = new List<String>(si2.numElements);
+            for (int i2 = 0; i2 < si2.numElements; ++i2) {
+              
+              keys0[i2] = decoder2.decodeString(bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i2, false);
+            }
+          }
+        }
+        {
+          
+          var decoder2 = decoder1.decodePointer(bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize, false);
+          {
+            var si2 = decoder2.decodeDataHeaderForPointerArray(keys0.length);
+            values0 = new List<List<int>>(si2.numElements);
+            for (int i2 = 0; i2 < si2.numElements; ++i2) {
+              
+              values0[i2] = decoder2.decodeUint8Array(bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i2, bindings.kNothingNullable, bindings.kUnspecifiedArrayLength);
+            }
+          }
+        }
+        result.properties = new Map<String, List<int>>.fromIterables(
+            keys0, values0);
+      }
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.visible = decoder0.decodeBool(32, 0);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.drawn = decoder0.decodeBool(32, 1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(40, false);
+      result.viewportMetrics = native_viewport_mojom.ViewportMetrics.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeUint32(parentId, 8);
+    
+    encoder0.encodeUint32(viewId, 12);
+    
+    encoder0.encodeStruct(bounds, 16, false);
+    
+    if (properties == null) {
+      encoder0.encodeNullPointer(24, false);
+    } else {
+      var encoder1 = encoder0.encoderForMap(24);
+      int size0 = properties.length;
+      var keys0 = properties.keys.toList();
+      var values0 = properties.values.toList();
+      
+      {
+        var encoder2 = encoder1.encodePointerArray(keys0.length, bindings.ArrayDataHeader.kHeaderSize, bindings.kUnspecifiedArrayLength);
+        for (int i1 = 0; i1 < keys0.length; ++i1) {
+          
+          encoder2.encodeString(keys0[i1], bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i1, false);
+        }
+      }
+      
+      {
+        var encoder2 = encoder1.encodePointerArray(values0.length, bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize, bindings.kUnspecifiedArrayLength);
+        for (int i1 = 0; i1 < values0.length; ++i1) {
+          
+          encoder2.encodeUint8Array(values0[i1], bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i1, bindings.kNothingNullable, bindings.kUnspecifiedArrayLength);
+        }
+      }
+    }
+    
+    encoder0.encodeBool(visible, 32, 0);
+    
+    encoder0.encodeBool(drawn, 32, 1);
+    
+    encoder0.encodeStruct(viewportMetrics, 40, false);
+  }
+
+  String toString() {
+    return "ViewData("
+           "parentId: $parentId" ", "
+           "viewId: $viewId" ", "
+           "bounds: $bounds" ", "
+           "properties: $properties" ", "
+           "visible: $visible" ", "
+           "drawn: $drawn" ", "
+           "viewportMetrics: $viewportMetrics" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["parentId"] = parentId;
+    map["viewId"] = viewId;
+    map["bounds"] = bounds;
+    map["properties"] = properties;
+    map["visible"] = visible;
+    map["drawn"] = drawn;
+    map["viewportMetrics"] = viewportMetrics;
+    return map;
+  }
+}
+
+
+class ViewManagerServiceCreateViewParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  int viewId = 0;
+
+  ViewManagerServiceCreateViewParams() : super(kVersions.last.size);
+
+  static ViewManagerServiceCreateViewParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ViewManagerServiceCreateViewParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ViewManagerServiceCreateViewParams result = new ViewManagerServiceCreateViewParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.viewId = decoder0.decodeUint32(8);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeUint32(viewId, 8);
+  }
+
+  String toString() {
+    return "ViewManagerServiceCreateViewParams("
+           "viewId: $viewId" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["viewId"] = viewId;
+    return map;
+  }
+}
+
+
+class ViewManagerServiceCreateViewResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  ErrorCode errorCode = null;
+
+  ViewManagerServiceCreateViewResponseParams() : super(kVersions.last.size);
+
+  static ViewManagerServiceCreateViewResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ViewManagerServiceCreateViewResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ViewManagerServiceCreateViewResponseParams result = new ViewManagerServiceCreateViewResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+        result.errorCode = ErrorCode.decode(decoder0, 8);
+        if (result.errorCode == null) {
+          throw new bindings.MojoCodecError(
+            'Trying to decode null union for non-nullable ErrorCode.');
+        }
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeEnum(errorCode, 8);
+  }
+
+  String toString() {
+    return "ViewManagerServiceCreateViewResponseParams("
+           "errorCode: $errorCode" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["errorCode"] = errorCode;
+    return map;
+  }
+}
+
+
+class ViewManagerServiceDeleteViewParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  int viewId = 0;
+
+  ViewManagerServiceDeleteViewParams() : super(kVersions.last.size);
+
+  static ViewManagerServiceDeleteViewParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ViewManagerServiceDeleteViewParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ViewManagerServiceDeleteViewParams result = new ViewManagerServiceDeleteViewParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.viewId = decoder0.decodeUint32(8);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeUint32(viewId, 8);
+  }
+
+  String toString() {
+    return "ViewManagerServiceDeleteViewParams("
+           "viewId: $viewId" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["viewId"] = viewId;
+    return map;
+  }
+}
+
+
+class ViewManagerServiceDeleteViewResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  bool success = false;
+
+  ViewManagerServiceDeleteViewResponseParams() : super(kVersions.last.size);
+
+  static ViewManagerServiceDeleteViewResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ViewManagerServiceDeleteViewResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ViewManagerServiceDeleteViewResponseParams result = new ViewManagerServiceDeleteViewResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.success = decoder0.decodeBool(8, 0);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeBool(success, 8, 0);
+  }
+
+  String toString() {
+    return "ViewManagerServiceDeleteViewResponseParams("
+           "success: $success" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["success"] = success;
+    return map;
+  }
+}
+
+
+class ViewManagerServiceSetViewBoundsParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  int viewId = 0;
+  geometry_mojom.Rect bounds = null;
+
+  ViewManagerServiceSetViewBoundsParams() : super(kVersions.last.size);
+
+  static ViewManagerServiceSetViewBoundsParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ViewManagerServiceSetViewBoundsParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ViewManagerServiceSetViewBoundsParams result = new ViewManagerServiceSetViewBoundsParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.viewId = decoder0.decodeUint32(8);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(16, false);
+      result.bounds = geometry_mojom.Rect.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeUint32(viewId, 8);
+    
+    encoder0.encodeStruct(bounds, 16, false);
+  }
+
+  String toString() {
+    return "ViewManagerServiceSetViewBoundsParams("
+           "viewId: $viewId" ", "
+           "bounds: $bounds" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["viewId"] = viewId;
+    map["bounds"] = bounds;
+    return map;
+  }
+}
+
+
+class ViewManagerServiceSetViewBoundsResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  bool success = false;
+
+  ViewManagerServiceSetViewBoundsResponseParams() : super(kVersions.last.size);
+
+  static ViewManagerServiceSetViewBoundsResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ViewManagerServiceSetViewBoundsResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ViewManagerServiceSetViewBoundsResponseParams result = new ViewManagerServiceSetViewBoundsResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.success = decoder0.decodeBool(8, 0);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeBool(success, 8, 0);
+  }
+
+  String toString() {
+    return "ViewManagerServiceSetViewBoundsResponseParams("
+           "success: $success" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["success"] = success;
+    return map;
+  }
+}
+
+
+class ViewManagerServiceSetViewVisibilityParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  int viewId = 0;
+  bool visible = false;
+
+  ViewManagerServiceSetViewVisibilityParams() : super(kVersions.last.size);
+
+  static ViewManagerServiceSetViewVisibilityParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ViewManagerServiceSetViewVisibilityParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ViewManagerServiceSetViewVisibilityParams result = new ViewManagerServiceSetViewVisibilityParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.viewId = decoder0.decodeUint32(8);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.visible = decoder0.decodeBool(12, 0);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeUint32(viewId, 8);
+    
+    encoder0.encodeBool(visible, 12, 0);
+  }
+
+  String toString() {
+    return "ViewManagerServiceSetViewVisibilityParams("
+           "viewId: $viewId" ", "
+           "visible: $visible" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["viewId"] = viewId;
+    map["visible"] = visible;
+    return map;
+  }
+}
+
+
+class ViewManagerServiceSetViewVisibilityResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  bool success = false;
+
+  ViewManagerServiceSetViewVisibilityResponseParams() : super(kVersions.last.size);
+
+  static ViewManagerServiceSetViewVisibilityResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ViewManagerServiceSetViewVisibilityResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ViewManagerServiceSetViewVisibilityResponseParams result = new ViewManagerServiceSetViewVisibilityResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.success = decoder0.decodeBool(8, 0);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeBool(success, 8, 0);
+  }
+
+  String toString() {
+    return "ViewManagerServiceSetViewVisibilityResponseParams("
+           "success: $success" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["success"] = success;
+    return map;
+  }
+}
+
+
+class ViewManagerServiceSetViewPropertyParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(32, 0)
+  ];
+  int viewId = 0;
+  String name = null;
+  List<int> value = null;
+
+  ViewManagerServiceSetViewPropertyParams() : super(kVersions.last.size);
+
+  static ViewManagerServiceSetViewPropertyParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ViewManagerServiceSetViewPropertyParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ViewManagerServiceSetViewPropertyParams result = new ViewManagerServiceSetViewPropertyParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.viewId = decoder0.decodeUint32(8);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.name = decoder0.decodeString(16, false);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.value = decoder0.decodeUint8Array(24, bindings.kArrayNullable, bindings.kUnspecifiedArrayLength);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeUint32(viewId, 8);
+    
+    encoder0.encodeString(name, 16, false);
+    
+    encoder0.encodeUint8Array(value, 24, bindings.kArrayNullable, bindings.kUnspecifiedArrayLength);
+  }
+
+  String toString() {
+    return "ViewManagerServiceSetViewPropertyParams("
+           "viewId: $viewId" ", "
+           "name: $name" ", "
+           "value: $value" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["viewId"] = viewId;
+    map["name"] = name;
+    map["value"] = value;
+    return map;
+  }
+}
+
+
+class ViewManagerServiceSetViewPropertyResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  bool success = false;
+
+  ViewManagerServiceSetViewPropertyResponseParams() : super(kVersions.last.size);
+
+  static ViewManagerServiceSetViewPropertyResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ViewManagerServiceSetViewPropertyResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ViewManagerServiceSetViewPropertyResponseParams result = new ViewManagerServiceSetViewPropertyResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.success = decoder0.decodeBool(8, 0);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeBool(success, 8, 0);
+  }
+
+  String toString() {
+    return "ViewManagerServiceSetViewPropertyResponseParams("
+           "success: $success" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["success"] = success;
+    return map;
+  }
+}
+
+
+class ViewManagerServiceAddViewParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  int parent = 0;
+  int child = 0;
+
+  ViewManagerServiceAddViewParams() : super(kVersions.last.size);
+
+  static ViewManagerServiceAddViewParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ViewManagerServiceAddViewParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ViewManagerServiceAddViewParams result = new ViewManagerServiceAddViewParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.parent = decoder0.decodeUint32(8);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.child = decoder0.decodeUint32(12);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeUint32(parent, 8);
+    
+    encoder0.encodeUint32(child, 12);
+  }
+
+  String toString() {
+    return "ViewManagerServiceAddViewParams("
+           "parent: $parent" ", "
+           "child: $child" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["parent"] = parent;
+    map["child"] = child;
+    return map;
+  }
+}
+
+
+class ViewManagerServiceAddViewResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  bool success = false;
+
+  ViewManagerServiceAddViewResponseParams() : super(kVersions.last.size);
+
+  static ViewManagerServiceAddViewResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ViewManagerServiceAddViewResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ViewManagerServiceAddViewResponseParams result = new ViewManagerServiceAddViewResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.success = decoder0.decodeBool(8, 0);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeBool(success, 8, 0);
+  }
+
+  String toString() {
+    return "ViewManagerServiceAddViewResponseParams("
+           "success: $success" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["success"] = success;
+    return map;
+  }
+}
+
+
+class ViewManagerServiceRemoveViewFromParentParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  int viewId = 0;
+
+  ViewManagerServiceRemoveViewFromParentParams() : super(kVersions.last.size);
+
+  static ViewManagerServiceRemoveViewFromParentParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ViewManagerServiceRemoveViewFromParentParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ViewManagerServiceRemoveViewFromParentParams result = new ViewManagerServiceRemoveViewFromParentParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.viewId = decoder0.decodeUint32(8);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeUint32(viewId, 8);
+  }
+
+  String toString() {
+    return "ViewManagerServiceRemoveViewFromParentParams("
+           "viewId: $viewId" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["viewId"] = viewId;
+    return map;
+  }
+}
+
+
+class ViewManagerServiceRemoveViewFromParentResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  bool success = false;
+
+  ViewManagerServiceRemoveViewFromParentResponseParams() : super(kVersions.last.size);
+
+  static ViewManagerServiceRemoveViewFromParentResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ViewManagerServiceRemoveViewFromParentResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ViewManagerServiceRemoveViewFromParentResponseParams result = new ViewManagerServiceRemoveViewFromParentResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.success = decoder0.decodeBool(8, 0);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeBool(success, 8, 0);
+  }
+
+  String toString() {
+    return "ViewManagerServiceRemoveViewFromParentResponseParams("
+           "success: $success" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["success"] = success;
+    return map;
+  }
+}
+
+
+class ViewManagerServiceReorderViewParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  int viewId = 0;
+  int relativeViewId = 0;
+  view_manager_constants_mojom.OrderDirection direction = null;
+
+  ViewManagerServiceReorderViewParams() : super(kVersions.last.size);
+
+  static ViewManagerServiceReorderViewParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ViewManagerServiceReorderViewParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ViewManagerServiceReorderViewParams result = new ViewManagerServiceReorderViewParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.viewId = decoder0.decodeUint32(8);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.relativeViewId = decoder0.decodeUint32(12);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+        result.direction = view_manager_constants_mojom.OrderDirection.decode(decoder0, 16);
+        if (result.direction == null) {
+          throw new bindings.MojoCodecError(
+            'Trying to decode null union for non-nullable view_manager_constants_mojom.OrderDirection.');
+        }
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeUint32(viewId, 8);
+    
+    encoder0.encodeUint32(relativeViewId, 12);
+    
+    encoder0.encodeEnum(direction, 16);
+  }
+
+  String toString() {
+    return "ViewManagerServiceReorderViewParams("
+           "viewId: $viewId" ", "
+           "relativeViewId: $relativeViewId" ", "
+           "direction: $direction" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["viewId"] = viewId;
+    map["relativeViewId"] = relativeViewId;
+    map["direction"] = direction;
+    return map;
+  }
+}
+
+
+class ViewManagerServiceReorderViewResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  bool success = false;
+
+  ViewManagerServiceReorderViewResponseParams() : super(kVersions.last.size);
+
+  static ViewManagerServiceReorderViewResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ViewManagerServiceReorderViewResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ViewManagerServiceReorderViewResponseParams result = new ViewManagerServiceReorderViewResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.success = decoder0.decodeBool(8, 0);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeBool(success, 8, 0);
+  }
+
+  String toString() {
+    return "ViewManagerServiceReorderViewResponseParams("
+           "success: $success" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["success"] = success;
+    return map;
+  }
+}
+
+
+class ViewManagerServiceGetViewTreeParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  int viewId = 0;
+
+  ViewManagerServiceGetViewTreeParams() : super(kVersions.last.size);
+
+  static ViewManagerServiceGetViewTreeParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ViewManagerServiceGetViewTreeParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ViewManagerServiceGetViewTreeParams result = new ViewManagerServiceGetViewTreeParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.viewId = decoder0.decodeUint32(8);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeUint32(viewId, 8);
+  }
+
+  String toString() {
+    return "ViewManagerServiceGetViewTreeParams("
+           "viewId: $viewId" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["viewId"] = viewId;
+    return map;
+  }
+}
+
+
+class ViewManagerServiceGetViewTreeResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  List<ViewData> views = null;
+
+  ViewManagerServiceGetViewTreeResponseParams() : super(kVersions.last.size);
+
+  static ViewManagerServiceGetViewTreeResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ViewManagerServiceGetViewTreeResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ViewManagerServiceGetViewTreeResponseParams result = new ViewManagerServiceGetViewTreeResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, false);
+      {
+        var si1 = decoder1.decodeDataHeaderForPointerArray(bindings.kUnspecifiedArrayLength);
+        result.views = new List<ViewData>(si1.numElements);
+        for (int i1 = 0; i1 < si1.numElements; ++i1) {
+          
+          var decoder2 = decoder1.decodePointer(bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i1, false);
+          result.views[i1] = ViewData.decode(decoder2);
+        }
+      }
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    if (views == null) {
+      encoder0.encodeNullPointer(8, false);
+    } else {
+      var encoder1 = encoder0.encodePointerArray(views.length, 8, bindings.kUnspecifiedArrayLength);
+      for (int i0 = 0; i0 < views.length; ++i0) {
+        
+        encoder1.encodeStruct(views[i0], bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i0, false);
+      }
+    }
+  }
+
+  String toString() {
+    return "ViewManagerServiceGetViewTreeResponseParams("
+           "views: $views" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["views"] = views;
+    return map;
+  }
+}
+
+
+class ViewManagerServiceSetViewSurfaceIdParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  int viewId = 0;
+  surface_id_mojom.SurfaceId surfaceId = null;
+
+  ViewManagerServiceSetViewSurfaceIdParams() : super(kVersions.last.size);
+
+  static ViewManagerServiceSetViewSurfaceIdParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ViewManagerServiceSetViewSurfaceIdParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ViewManagerServiceSetViewSurfaceIdParams result = new ViewManagerServiceSetViewSurfaceIdParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.viewId = decoder0.decodeUint32(8);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(16, false);
+      result.surfaceId = surface_id_mojom.SurfaceId.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeUint32(viewId, 8);
+    
+    encoder0.encodeStruct(surfaceId, 16, false);
+  }
+
+  String toString() {
+    return "ViewManagerServiceSetViewSurfaceIdParams("
+           "viewId: $viewId" ", "
+           "surfaceId: $surfaceId" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["viewId"] = viewId;
+    map["surfaceId"] = surfaceId;
+    return map;
+  }
+}
+
+
+class ViewManagerServiceSetViewSurfaceIdResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  bool success = false;
+
+  ViewManagerServiceSetViewSurfaceIdResponseParams() : super(kVersions.last.size);
+
+  static ViewManagerServiceSetViewSurfaceIdResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ViewManagerServiceSetViewSurfaceIdResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ViewManagerServiceSetViewSurfaceIdResponseParams result = new ViewManagerServiceSetViewSurfaceIdResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.success = decoder0.decodeBool(8, 0);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeBool(success, 8, 0);
+  }
+
+  String toString() {
+    return "ViewManagerServiceSetViewSurfaceIdResponseParams("
+           "success: $success" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["success"] = success;
+    return map;
+  }
+}
+
+
+class ViewManagerServiceEmbedUrlParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(32, 0)
+  ];
+  String url = null;
+  int viewId = 0;
+  Object services = null;
+  Object exposedServices = null;
+
+  ViewManagerServiceEmbedUrlParams() : super(kVersions.last.size);
+
+  static ViewManagerServiceEmbedUrlParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ViewManagerServiceEmbedUrlParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ViewManagerServiceEmbedUrlParams result = new ViewManagerServiceEmbedUrlParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.url = decoder0.decodeString(8, false);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.viewId = decoder0.decodeUint32(16);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.services = decoder0.decodeInterfaceRequest(20, true, service_provider_mojom.ServiceProviderStub.newFromEndpoint);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.exposedServices = decoder0.decodeServiceInterface(24, true, service_provider_mojom.ServiceProviderProxy.newFromEndpoint);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeString(url, 8, false);
+    
+    encoder0.encodeUint32(viewId, 16);
+    
+    encoder0.encodeInterfaceRequest(services, 20, true);
+    
+    encoder0.encodeInterface(exposedServices, 24, true);
+  }
+
+  String toString() {
+    return "ViewManagerServiceEmbedUrlParams("
+           "url: $url" ", "
+           "viewId: $viewId" ", "
+           "services: $services" ", "
+           "exposedServices: $exposedServices" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+
+class ViewManagerServiceEmbedUrlResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  bool success = false;
+
+  ViewManagerServiceEmbedUrlResponseParams() : super(kVersions.last.size);
+
+  static ViewManagerServiceEmbedUrlResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ViewManagerServiceEmbedUrlResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ViewManagerServiceEmbedUrlResponseParams result = new ViewManagerServiceEmbedUrlResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.success = decoder0.decodeBool(8, 0);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeBool(success, 8, 0);
+  }
+
+  String toString() {
+    return "ViewManagerServiceEmbedUrlResponseParams("
+           "success: $success" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["success"] = success;
+    return map;
+  }
+}
+
+
+class ViewManagerServiceEmbedParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  int viewId = 0;
+  Object client = null;
+
+  ViewManagerServiceEmbedParams() : super(kVersions.last.size);
+
+  static ViewManagerServiceEmbedParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ViewManagerServiceEmbedParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ViewManagerServiceEmbedParams result = new ViewManagerServiceEmbedParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.viewId = decoder0.decodeUint32(8);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.client = decoder0.decodeServiceInterface(12, false, ViewManagerClientProxy.newFromEndpoint);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeUint32(viewId, 8);
+    
+    encoder0.encodeInterface(client, 12, false);
+  }
+
+  String toString() {
+    return "ViewManagerServiceEmbedParams("
+           "viewId: $viewId" ", "
+           "client: $client" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+
+class ViewManagerServiceEmbedResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  bool success = false;
+
+  ViewManagerServiceEmbedResponseParams() : super(kVersions.last.size);
+
+  static ViewManagerServiceEmbedResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ViewManagerServiceEmbedResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ViewManagerServiceEmbedResponseParams result = new ViewManagerServiceEmbedResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.success = decoder0.decodeBool(8, 0);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeBool(success, 8, 0);
+  }
+
+  String toString() {
+    return "ViewManagerServiceEmbedResponseParams("
+           "success: $success" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["success"] = success;
+    return map;
+  }
+}
+
+
+class ViewManagerServicePerformActionParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  int viewId = 0;
+  String action = null;
+
+  ViewManagerServicePerformActionParams() : super(kVersions.last.size);
+
+  static ViewManagerServicePerformActionParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ViewManagerServicePerformActionParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ViewManagerServicePerformActionParams result = new ViewManagerServicePerformActionParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.viewId = decoder0.decodeUint32(8);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.action = decoder0.decodeString(16, false);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeUint32(viewId, 8);
+    
+    encoder0.encodeString(action, 16, false);
+  }
+
+  String toString() {
+    return "ViewManagerServicePerformActionParams("
+           "viewId: $viewId" ", "
+           "action: $action" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["viewId"] = viewId;
+    map["action"] = action;
+    return map;
+  }
+}
+
+
+class ViewManagerServicePerformActionResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  bool success = false;
+
+  ViewManagerServicePerformActionResponseParams() : super(kVersions.last.size);
+
+  static ViewManagerServicePerformActionResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ViewManagerServicePerformActionResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ViewManagerServicePerformActionResponseParams result = new ViewManagerServicePerformActionResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.success = decoder0.decodeBool(8, 0);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeBool(success, 8, 0);
+  }
+
+  String toString() {
+    return "ViewManagerServicePerformActionResponseParams("
+           "success: $success" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["success"] = success;
+    return map;
+  }
+}
+
+
+class ViewManagerClientOnEmbedParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(56, 0)
+  ];
+  int connectionId = 0;
+  Object services = null;
+  String embedderUrl = null;
+  ViewData root = null;
+  Object viewManagerService = null;
+  Object exposedServices = null;
+  core.MojoMessagePipeEndpoint windowManagerPipe = null;
+
+  ViewManagerClientOnEmbedParams() : super(kVersions.last.size);
+
+  static ViewManagerClientOnEmbedParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ViewManagerClientOnEmbedParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ViewManagerClientOnEmbedParams result = new ViewManagerClientOnEmbedParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.connectionId = decoder0.decodeUint16(8);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.services = decoder0.decodeInterfaceRequest(12, true, service_provider_mojom.ServiceProviderStub.newFromEndpoint);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.embedderUrl = decoder0.decodeString(16, false);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(24, false);
+      result.root = ViewData.decode(decoder1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.viewManagerService = decoder0.decodeServiceInterface(32, true, ViewManagerServiceProxy.newFromEndpoint);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.exposedServices = decoder0.decodeServiceInterface(40, true, service_provider_mojom.ServiceProviderProxy.newFromEndpoint);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.windowManagerPipe = decoder0.decodeMessagePipeHandle(48, false);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeUint16(connectionId, 8);
+    
+    encoder0.encodeInterfaceRequest(services, 12, true);
+    
+    encoder0.encodeString(embedderUrl, 16, false);
+    
+    encoder0.encodeStruct(root, 24, false);
+    
+    encoder0.encodeInterface(viewManagerService, 32, true);
+    
+    encoder0.encodeInterface(exposedServices, 40, true);
+    
+    encoder0.encodeMessagePipeHandle(windowManagerPipe, 48, false);
+  }
+
+  String toString() {
+    return "ViewManagerClientOnEmbedParams("
+           "connectionId: $connectionId" ", "
+           "services: $services" ", "
+           "embedderUrl: $embedderUrl" ", "
+           "root: $root" ", "
+           "viewManagerService: $viewManagerService" ", "
+           "exposedServices: $exposedServices" ", "
+           "windowManagerPipe: $windowManagerPipe" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+
+class ViewManagerClientOnEmbeddedAppDisconnectedParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  int view = 0;
+
+  ViewManagerClientOnEmbeddedAppDisconnectedParams() : super(kVersions.last.size);
+
+  static ViewManagerClientOnEmbeddedAppDisconnectedParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ViewManagerClientOnEmbeddedAppDisconnectedParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ViewManagerClientOnEmbeddedAppDisconnectedParams result = new ViewManagerClientOnEmbeddedAppDisconnectedParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.view = decoder0.decodeUint32(8);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeUint32(view, 8);
+  }
+
+  String toString() {
+    return "ViewManagerClientOnEmbeddedAppDisconnectedParams("
+           "view: $view" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["view"] = view;
+    return map;
+  }
+}
+
+
+class ViewManagerClientOnViewBoundsChangedParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(32, 0)
+  ];
+  int view = 0;
+  geometry_mojom.Rect oldBounds = null;
+  geometry_mojom.Rect newBounds = null;
+
+  ViewManagerClientOnViewBoundsChangedParams() : super(kVersions.last.size);
+
+  static ViewManagerClientOnViewBoundsChangedParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ViewManagerClientOnViewBoundsChangedParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ViewManagerClientOnViewBoundsChangedParams result = new ViewManagerClientOnViewBoundsChangedParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.view = decoder0.decodeUint32(8);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(16, false);
+      result.oldBounds = geometry_mojom.Rect.decode(decoder1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(24, false);
+      result.newBounds = geometry_mojom.Rect.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeUint32(view, 8);
+    
+    encoder0.encodeStruct(oldBounds, 16, false);
+    
+    encoder0.encodeStruct(newBounds, 24, false);
+  }
+
+  String toString() {
+    return "ViewManagerClientOnViewBoundsChangedParams("
+           "view: $view" ", "
+           "oldBounds: $oldBounds" ", "
+           "newBounds: $newBounds" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["view"] = view;
+    map["oldBounds"] = oldBounds;
+    map["newBounds"] = newBounds;
+    return map;
+  }
+}
+
+
+class ViewManagerClientOnViewViewportMetricsChangedParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  native_viewport_mojom.ViewportMetrics oldMetrics = null;
+  native_viewport_mojom.ViewportMetrics newMetrics = null;
+
+  ViewManagerClientOnViewViewportMetricsChangedParams() : super(kVersions.last.size);
+
+  static ViewManagerClientOnViewViewportMetricsChangedParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ViewManagerClientOnViewViewportMetricsChangedParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ViewManagerClientOnViewViewportMetricsChangedParams result = new ViewManagerClientOnViewViewportMetricsChangedParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, false);
+      result.oldMetrics = native_viewport_mojom.ViewportMetrics.decode(decoder1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(16, false);
+      result.newMetrics = native_viewport_mojom.ViewportMetrics.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(oldMetrics, 8, false);
+    
+    encoder0.encodeStruct(newMetrics, 16, false);
+  }
+
+  String toString() {
+    return "ViewManagerClientOnViewViewportMetricsChangedParams("
+           "oldMetrics: $oldMetrics" ", "
+           "newMetrics: $newMetrics" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["oldMetrics"] = oldMetrics;
+    map["newMetrics"] = newMetrics;
+    return map;
+  }
+}
+
+
+class ViewManagerClientOnViewHierarchyChangedParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(32, 0)
+  ];
+  int view = 0;
+  int newParent = 0;
+  int oldParent = 0;
+  List<ViewData> views = null;
+
+  ViewManagerClientOnViewHierarchyChangedParams() : super(kVersions.last.size);
+
+  static ViewManagerClientOnViewHierarchyChangedParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ViewManagerClientOnViewHierarchyChangedParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ViewManagerClientOnViewHierarchyChangedParams result = new ViewManagerClientOnViewHierarchyChangedParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.view = decoder0.decodeUint32(8);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.newParent = decoder0.decodeUint32(12);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.oldParent = decoder0.decodeUint32(16);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(24, false);
+      {
+        var si1 = decoder1.decodeDataHeaderForPointerArray(bindings.kUnspecifiedArrayLength);
+        result.views = new List<ViewData>(si1.numElements);
+        for (int i1 = 0; i1 < si1.numElements; ++i1) {
+          
+          var decoder2 = decoder1.decodePointer(bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i1, false);
+          result.views[i1] = ViewData.decode(decoder2);
+        }
+      }
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeUint32(view, 8);
+    
+    encoder0.encodeUint32(newParent, 12);
+    
+    encoder0.encodeUint32(oldParent, 16);
+    
+    if (views == null) {
+      encoder0.encodeNullPointer(24, false);
+    } else {
+      var encoder1 = encoder0.encodePointerArray(views.length, 24, bindings.kUnspecifiedArrayLength);
+      for (int i0 = 0; i0 < views.length; ++i0) {
+        
+        encoder1.encodeStruct(views[i0], bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i0, false);
+      }
+    }
+  }
+
+  String toString() {
+    return "ViewManagerClientOnViewHierarchyChangedParams("
+           "view: $view" ", "
+           "newParent: $newParent" ", "
+           "oldParent: $oldParent" ", "
+           "views: $views" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["view"] = view;
+    map["newParent"] = newParent;
+    map["oldParent"] = oldParent;
+    map["views"] = views;
+    return map;
+  }
+}
+
+
+class ViewManagerClientOnViewReorderedParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  int viewId = 0;
+  int relativeViewId = 0;
+  view_manager_constants_mojom.OrderDirection direction = null;
+
+  ViewManagerClientOnViewReorderedParams() : super(kVersions.last.size);
+
+  static ViewManagerClientOnViewReorderedParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ViewManagerClientOnViewReorderedParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ViewManagerClientOnViewReorderedParams result = new ViewManagerClientOnViewReorderedParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.viewId = decoder0.decodeUint32(8);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.relativeViewId = decoder0.decodeUint32(12);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+        result.direction = view_manager_constants_mojom.OrderDirection.decode(decoder0, 16);
+        if (result.direction == null) {
+          throw new bindings.MojoCodecError(
+            'Trying to decode null union for non-nullable view_manager_constants_mojom.OrderDirection.');
+        }
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeUint32(viewId, 8);
+    
+    encoder0.encodeUint32(relativeViewId, 12);
+    
+    encoder0.encodeEnum(direction, 16);
+  }
+
+  String toString() {
+    return "ViewManagerClientOnViewReorderedParams("
+           "viewId: $viewId" ", "
+           "relativeViewId: $relativeViewId" ", "
+           "direction: $direction" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["viewId"] = viewId;
+    map["relativeViewId"] = relativeViewId;
+    map["direction"] = direction;
+    return map;
+  }
+}
+
+
+class ViewManagerClientOnViewDeletedParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  int view = 0;
+
+  ViewManagerClientOnViewDeletedParams() : super(kVersions.last.size);
+
+  static ViewManagerClientOnViewDeletedParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ViewManagerClientOnViewDeletedParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ViewManagerClientOnViewDeletedParams result = new ViewManagerClientOnViewDeletedParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.view = decoder0.decodeUint32(8);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeUint32(view, 8);
+  }
+
+  String toString() {
+    return "ViewManagerClientOnViewDeletedParams("
+           "view: $view" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["view"] = view;
+    return map;
+  }
+}
+
+
+class ViewManagerClientOnViewVisibilityChangedParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  int view = 0;
+  bool visible = false;
+
+  ViewManagerClientOnViewVisibilityChangedParams() : super(kVersions.last.size);
+
+  static ViewManagerClientOnViewVisibilityChangedParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ViewManagerClientOnViewVisibilityChangedParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ViewManagerClientOnViewVisibilityChangedParams result = new ViewManagerClientOnViewVisibilityChangedParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.view = decoder0.decodeUint32(8);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.visible = decoder0.decodeBool(12, 0);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeUint32(view, 8);
+    
+    encoder0.encodeBool(visible, 12, 0);
+  }
+
+  String toString() {
+    return "ViewManagerClientOnViewVisibilityChangedParams("
+           "view: $view" ", "
+           "visible: $visible" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["view"] = view;
+    map["visible"] = visible;
+    return map;
+  }
+}
+
+
+class ViewManagerClientOnViewDrawnStateChangedParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  int view = 0;
+  bool drawn = false;
+
+  ViewManagerClientOnViewDrawnStateChangedParams() : super(kVersions.last.size);
+
+  static ViewManagerClientOnViewDrawnStateChangedParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ViewManagerClientOnViewDrawnStateChangedParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ViewManagerClientOnViewDrawnStateChangedParams result = new ViewManagerClientOnViewDrawnStateChangedParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.view = decoder0.decodeUint32(8);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.drawn = decoder0.decodeBool(12, 0);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeUint32(view, 8);
+    
+    encoder0.encodeBool(drawn, 12, 0);
+  }
+
+  String toString() {
+    return "ViewManagerClientOnViewDrawnStateChangedParams("
+           "view: $view" ", "
+           "drawn: $drawn" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["view"] = view;
+    map["drawn"] = drawn;
+    return map;
+  }
+}
+
+
+class ViewManagerClientOnViewSharedPropertyChangedParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(32, 0)
+  ];
+  int view = 0;
+  String name = null;
+  List<int> newData = null;
+
+  ViewManagerClientOnViewSharedPropertyChangedParams() : super(kVersions.last.size);
+
+  static ViewManagerClientOnViewSharedPropertyChangedParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ViewManagerClientOnViewSharedPropertyChangedParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ViewManagerClientOnViewSharedPropertyChangedParams result = new ViewManagerClientOnViewSharedPropertyChangedParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.view = decoder0.decodeUint32(8);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.name = decoder0.decodeString(16, false);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.newData = decoder0.decodeUint8Array(24, bindings.kArrayNullable, bindings.kUnspecifiedArrayLength);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeUint32(view, 8);
+    
+    encoder0.encodeString(name, 16, false);
+    
+    encoder0.encodeUint8Array(newData, 24, bindings.kArrayNullable, bindings.kUnspecifiedArrayLength);
+  }
+
+  String toString() {
+    return "ViewManagerClientOnViewSharedPropertyChangedParams("
+           "view: $view" ", "
+           "name: $name" ", "
+           "newData: $newData" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["view"] = view;
+    map["name"] = name;
+    map["newData"] = newData;
+    return map;
+  }
+}
+
+
+class ViewManagerClientOnViewInputEventParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  int view = 0;
+  input_events_mojom.Event event = null;
+
+  ViewManagerClientOnViewInputEventParams() : super(kVersions.last.size);
+
+  static ViewManagerClientOnViewInputEventParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ViewManagerClientOnViewInputEventParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ViewManagerClientOnViewInputEventParams result = new ViewManagerClientOnViewInputEventParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.view = decoder0.decodeUint32(8);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(16, false);
+      result.event = input_events_mojom.Event.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeUint32(view, 8);
+    
+    encoder0.encodeStruct(event, 16, false);
+  }
+
+  String toString() {
+    return "ViewManagerClientOnViewInputEventParams("
+           "view: $view" ", "
+           "event: $event" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["view"] = view;
+    map["event"] = event;
+    return map;
+  }
+}
+
+
+class ViewManagerClientOnViewInputEventResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(8, 0)
+  ];
+
+  ViewManagerClientOnViewInputEventResponseParams() : super(kVersions.last.size);
+
+  static ViewManagerClientOnViewInputEventResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ViewManagerClientOnViewInputEventResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ViewManagerClientOnViewInputEventResponseParams result = new ViewManagerClientOnViewInputEventResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    encoder.getStructEncoderAtOffset(kVersions.last);
+  }
+
+  String toString() {
+    return "ViewManagerClientOnViewInputEventResponseParams("")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    return map;
+  }
+}
+
+
+class ViewManagerClientOnPerformActionParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  int viewId = 0;
+  String action = null;
+
+  ViewManagerClientOnPerformActionParams() : super(kVersions.last.size);
+
+  static ViewManagerClientOnPerformActionParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ViewManagerClientOnPerformActionParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ViewManagerClientOnPerformActionParams result = new ViewManagerClientOnPerformActionParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.viewId = decoder0.decodeUint32(8);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.action = decoder0.decodeString(16, false);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeUint32(viewId, 8);
+    
+    encoder0.encodeString(action, 16, false);
+  }
+
+  String toString() {
+    return "ViewManagerClientOnPerformActionParams("
+           "viewId: $viewId" ", "
+           "action: $action" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["viewId"] = viewId;
+    map["action"] = action;
+    return map;
+  }
+}
+
+
+class ViewManagerClientOnPerformActionResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  bool success = false;
+
+  ViewManagerClientOnPerformActionResponseParams() : super(kVersions.last.size);
+
+  static ViewManagerClientOnPerformActionResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ViewManagerClientOnPerformActionResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ViewManagerClientOnPerformActionResponseParams result = new ViewManagerClientOnPerformActionResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.success = decoder0.decodeBool(8, 0);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeBool(success, 8, 0);
+  }
+
+  String toString() {
+    return "ViewManagerClientOnPerformActionResponseParams("
+           "success: $success" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["success"] = success;
+    return map;
+  }
+}
+
+const int kViewManagerService_createView_name = 0;
+const int kViewManagerService_deleteView_name = 1;
+const int kViewManagerService_setViewBounds_name = 2;
+const int kViewManagerService_setViewVisibility_name = 3;
+const int kViewManagerService_setViewProperty_name = 4;
+const int kViewManagerService_addView_name = 5;
+const int kViewManagerService_removeViewFromParent_name = 6;
+const int kViewManagerService_reorderView_name = 7;
+const int kViewManagerService_getViewTree_name = 8;
+const int kViewManagerService_setViewSurfaceId_name = 9;
+const int kViewManagerService_embedUrl_name = 10;
+const int kViewManagerService_embed_name = 11;
+const int kViewManagerService_performAction_name = 12;
+
+const String ViewManagerServiceName =
+      'mojo::ViewManagerService';
+
+abstract class ViewManagerService {
+  dynamic createView(int viewId,[Function responseFactory = null]);
+  dynamic deleteView(int viewId,[Function responseFactory = null]);
+  dynamic setViewBounds(int viewId,geometry_mojom.Rect bounds,[Function responseFactory = null]);
+  dynamic setViewVisibility(int viewId,bool visible,[Function responseFactory = null]);
+  dynamic setViewProperty(int viewId,String name,List<int> value,[Function responseFactory = null]);
+  dynamic addView(int parent,int child,[Function responseFactory = null]);
+  dynamic removeViewFromParent(int viewId,[Function responseFactory = null]);
+  dynamic reorderView(int viewId,int relativeViewId,view_manager_constants_mojom.OrderDirection direction,[Function responseFactory = null]);
+  dynamic getViewTree(int viewId,[Function responseFactory = null]);
+  dynamic setViewSurfaceId(int viewId,surface_id_mojom.SurfaceId surfaceId,[Function responseFactory = null]);
+  dynamic embedUrl(String url,int viewId,Object services,Object exposedServices,[Function responseFactory = null]);
+  dynamic embed(int viewId,Object client,[Function responseFactory = null]);
+  dynamic performAction(int viewId,String action,[Function responseFactory = null]);
+
+}
+
+
+class ViewManagerServiceProxyImpl extends bindings.Proxy {
+  ViewManagerServiceProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  ViewManagerServiceProxyImpl.fromHandle(core.MojoHandle handle) :
+      super.fromHandle(handle);
+
+  ViewManagerServiceProxyImpl.unbound() : super.unbound();
+
+  static ViewManagerServiceProxyImpl newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ViewManagerServiceProxyImpl"));
+    return new ViewManagerServiceProxyImpl.fromEndpoint(endpoint);
+  }
+
+  String get name => ViewManagerServiceName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      case kViewManagerService_createView_name:
+        var r = ViewManagerServiceCreateViewResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      case kViewManagerService_deleteView_name:
+        var r = ViewManagerServiceDeleteViewResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      case kViewManagerService_setViewBounds_name:
+        var r = ViewManagerServiceSetViewBoundsResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      case kViewManagerService_setViewVisibility_name:
+        var r = ViewManagerServiceSetViewVisibilityResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      case kViewManagerService_setViewProperty_name:
+        var r = ViewManagerServiceSetViewPropertyResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      case kViewManagerService_addView_name:
+        var r = ViewManagerServiceAddViewResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      case kViewManagerService_removeViewFromParent_name:
+        var r = ViewManagerServiceRemoveViewFromParentResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      case kViewManagerService_reorderView_name:
+        var r = ViewManagerServiceReorderViewResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      case kViewManagerService_getViewTree_name:
+        var r = ViewManagerServiceGetViewTreeResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      case kViewManagerService_setViewSurfaceId_name:
+        var r = ViewManagerServiceSetViewSurfaceIdResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      case kViewManagerService_embedUrl_name:
+        var r = ViewManagerServiceEmbedUrlResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      case kViewManagerService_embed_name:
+        var r = ViewManagerServiceEmbedResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      case kViewManagerService_performAction_name:
+        var r = ViewManagerServicePerformActionResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "ViewManagerServiceProxyImpl($superString)";
+  }
+}
+
+
+class _ViewManagerServiceProxyCalls implements ViewManagerService {
+  ViewManagerServiceProxyImpl _proxyImpl;
+
+  _ViewManagerServiceProxyCalls(this._proxyImpl);
+    dynamic createView(int viewId,[Function responseFactory = null]) {
+      var params = new ViewManagerServiceCreateViewParams();
+      params.viewId = viewId;
+      return _proxyImpl.sendMessageWithRequestId(
+          params,
+          kViewManagerService_createView_name,
+          -1,
+          bindings.MessageHeader.kMessageExpectsResponse);
+    }
+    dynamic deleteView(int viewId,[Function responseFactory = null]) {
+      var params = new ViewManagerServiceDeleteViewParams();
+      params.viewId = viewId;
+      return _proxyImpl.sendMessageWithRequestId(
+          params,
+          kViewManagerService_deleteView_name,
+          -1,
+          bindings.MessageHeader.kMessageExpectsResponse);
+    }
+    dynamic setViewBounds(int viewId,geometry_mojom.Rect bounds,[Function responseFactory = null]) {
+      var params = new ViewManagerServiceSetViewBoundsParams();
+      params.viewId = viewId;
+      params.bounds = bounds;
+      return _proxyImpl.sendMessageWithRequestId(
+          params,
+          kViewManagerService_setViewBounds_name,
+          -1,
+          bindings.MessageHeader.kMessageExpectsResponse);
+    }
+    dynamic setViewVisibility(int viewId,bool visible,[Function responseFactory = null]) {
+      var params = new ViewManagerServiceSetViewVisibilityParams();
+      params.viewId = viewId;
+      params.visible = visible;
+      return _proxyImpl.sendMessageWithRequestId(
+          params,
+          kViewManagerService_setViewVisibility_name,
+          -1,
+          bindings.MessageHeader.kMessageExpectsResponse);
+    }
+    dynamic setViewProperty(int viewId,String name,List<int> value,[Function responseFactory = null]) {
+      var params = new ViewManagerServiceSetViewPropertyParams();
+      params.viewId = viewId;
+      params.name = name;
+      params.value = value;
+      return _proxyImpl.sendMessageWithRequestId(
+          params,
+          kViewManagerService_setViewProperty_name,
+          -1,
+          bindings.MessageHeader.kMessageExpectsResponse);
+    }
+    dynamic addView(int parent,int child,[Function responseFactory = null]) {
+      var params = new ViewManagerServiceAddViewParams();
+      params.parent = parent;
+      params.child = child;
+      return _proxyImpl.sendMessageWithRequestId(
+          params,
+          kViewManagerService_addView_name,
+          -1,
+          bindings.MessageHeader.kMessageExpectsResponse);
+    }
+    dynamic removeViewFromParent(int viewId,[Function responseFactory = null]) {
+      var params = new ViewManagerServiceRemoveViewFromParentParams();
+      params.viewId = viewId;
+      return _proxyImpl.sendMessageWithRequestId(
+          params,
+          kViewManagerService_removeViewFromParent_name,
+          -1,
+          bindings.MessageHeader.kMessageExpectsResponse);
+    }
+    dynamic reorderView(int viewId,int relativeViewId,view_manager_constants_mojom.OrderDirection direction,[Function responseFactory = null]) {
+      var params = new ViewManagerServiceReorderViewParams();
+      params.viewId = viewId;
+      params.relativeViewId = relativeViewId;
+      params.direction = direction;
+      return _proxyImpl.sendMessageWithRequestId(
+          params,
+          kViewManagerService_reorderView_name,
+          -1,
+          bindings.MessageHeader.kMessageExpectsResponse);
+    }
+    dynamic getViewTree(int viewId,[Function responseFactory = null]) {
+      var params = new ViewManagerServiceGetViewTreeParams();
+      params.viewId = viewId;
+      return _proxyImpl.sendMessageWithRequestId(
+          params,
+          kViewManagerService_getViewTree_name,
+          -1,
+          bindings.MessageHeader.kMessageExpectsResponse);
+    }
+    dynamic setViewSurfaceId(int viewId,surface_id_mojom.SurfaceId surfaceId,[Function responseFactory = null]) {
+      var params = new ViewManagerServiceSetViewSurfaceIdParams();
+      params.viewId = viewId;
+      params.surfaceId = surfaceId;
+      return _proxyImpl.sendMessageWithRequestId(
+          params,
+          kViewManagerService_setViewSurfaceId_name,
+          -1,
+          bindings.MessageHeader.kMessageExpectsResponse);
+    }
+    dynamic embedUrl(String url,int viewId,Object services,Object exposedServices,[Function responseFactory = null]) {
+      var params = new ViewManagerServiceEmbedUrlParams();
+      params.url = url;
+      params.viewId = viewId;
+      params.services = services;
+      params.exposedServices = exposedServices;
+      return _proxyImpl.sendMessageWithRequestId(
+          params,
+          kViewManagerService_embedUrl_name,
+          -1,
+          bindings.MessageHeader.kMessageExpectsResponse);
+    }
+    dynamic embed(int viewId,Object client,[Function responseFactory = null]) {
+      var params = new ViewManagerServiceEmbedParams();
+      params.viewId = viewId;
+      params.client = client;
+      return _proxyImpl.sendMessageWithRequestId(
+          params,
+          kViewManagerService_embed_name,
+          -1,
+          bindings.MessageHeader.kMessageExpectsResponse);
+    }
+    dynamic performAction(int viewId,String action,[Function responseFactory = null]) {
+      var params = new ViewManagerServicePerformActionParams();
+      params.viewId = viewId;
+      params.action = action;
+      return _proxyImpl.sendMessageWithRequestId(
+          params,
+          kViewManagerService_performAction_name,
+          -1,
+          bindings.MessageHeader.kMessageExpectsResponse);
+    }
+}
+
+
+class ViewManagerServiceProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  ViewManagerService ptr;
+  final String name = ViewManagerServiceName;
+
+  ViewManagerServiceProxy(ViewManagerServiceProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _ViewManagerServiceProxyCalls(proxyImpl);
+
+  ViewManagerServiceProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new ViewManagerServiceProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _ViewManagerServiceProxyCalls(impl);
+  }
+
+  ViewManagerServiceProxy.fromHandle(core.MojoHandle handle) :
+      impl = new ViewManagerServiceProxyImpl.fromHandle(handle) {
+    ptr = new _ViewManagerServiceProxyCalls(impl);
+  }
+
+  ViewManagerServiceProxy.unbound() :
+      impl = new ViewManagerServiceProxyImpl.unbound() {
+    ptr = new _ViewManagerServiceProxyCalls(impl);
+  }
+
+  factory ViewManagerServiceProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    ViewManagerServiceProxy p = new ViewManagerServiceProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static ViewManagerServiceProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ViewManagerServiceProxy"));
+    return new ViewManagerServiceProxy.fromEndpoint(endpoint);
+  }
+
+  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 "ViewManagerServiceProxy($impl)";
+  }
+}
+
+
+class ViewManagerServiceStub extends bindings.Stub {
+  ViewManagerService _impl = null;
+
+  ViewManagerServiceStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  ViewManagerServiceStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  ViewManagerServiceStub.unbound() : super.unbound();
+
+  static ViewManagerServiceStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ViewManagerServiceStub"));
+    return new ViewManagerServiceStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = ViewManagerServiceName;
+
+
+  ViewManagerServiceCreateViewResponseParams _ViewManagerServiceCreateViewResponseParamsFactory(ErrorCode errorCode) {
+    var result = new ViewManagerServiceCreateViewResponseParams();
+    result.errorCode = errorCode;
+    return result;
+  }
+  ViewManagerServiceDeleteViewResponseParams _ViewManagerServiceDeleteViewResponseParamsFactory(bool success) {
+    var result = new ViewManagerServiceDeleteViewResponseParams();
+    result.success = success;
+    return result;
+  }
+  ViewManagerServiceSetViewBoundsResponseParams _ViewManagerServiceSetViewBoundsResponseParamsFactory(bool success) {
+    var result = new ViewManagerServiceSetViewBoundsResponseParams();
+    result.success = success;
+    return result;
+  }
+  ViewManagerServiceSetViewVisibilityResponseParams _ViewManagerServiceSetViewVisibilityResponseParamsFactory(bool success) {
+    var result = new ViewManagerServiceSetViewVisibilityResponseParams();
+    result.success = success;
+    return result;
+  }
+  ViewManagerServiceSetViewPropertyResponseParams _ViewManagerServiceSetViewPropertyResponseParamsFactory(bool success) {
+    var result = new ViewManagerServiceSetViewPropertyResponseParams();
+    result.success = success;
+    return result;
+  }
+  ViewManagerServiceAddViewResponseParams _ViewManagerServiceAddViewResponseParamsFactory(bool success) {
+    var result = new ViewManagerServiceAddViewResponseParams();
+    result.success = success;
+    return result;
+  }
+  ViewManagerServiceRemoveViewFromParentResponseParams _ViewManagerServiceRemoveViewFromParentResponseParamsFactory(bool success) {
+    var result = new ViewManagerServiceRemoveViewFromParentResponseParams();
+    result.success = success;
+    return result;
+  }
+  ViewManagerServiceReorderViewResponseParams _ViewManagerServiceReorderViewResponseParamsFactory(bool success) {
+    var result = new ViewManagerServiceReorderViewResponseParams();
+    result.success = success;
+    return result;
+  }
+  ViewManagerServiceGetViewTreeResponseParams _ViewManagerServiceGetViewTreeResponseParamsFactory(List<ViewData> views) {
+    var result = new ViewManagerServiceGetViewTreeResponseParams();
+    result.views = views;
+    return result;
+  }
+  ViewManagerServiceSetViewSurfaceIdResponseParams _ViewManagerServiceSetViewSurfaceIdResponseParamsFactory(bool success) {
+    var result = new ViewManagerServiceSetViewSurfaceIdResponseParams();
+    result.success = success;
+    return result;
+  }
+  ViewManagerServiceEmbedUrlResponseParams _ViewManagerServiceEmbedUrlResponseParamsFactory(bool success) {
+    var result = new ViewManagerServiceEmbedUrlResponseParams();
+    result.success = success;
+    return result;
+  }
+  ViewManagerServiceEmbedResponseParams _ViewManagerServiceEmbedResponseParamsFactory(bool success) {
+    var result = new ViewManagerServiceEmbedResponseParams();
+    result.success = success;
+    return result;
+  }
+  ViewManagerServicePerformActionResponseParams _ViewManagerServicePerformActionResponseParamsFactory(bool success) {
+    var result = new ViewManagerServicePerformActionResponseParams();
+    result.success = success;
+    return result;
+  }
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      case kViewManagerService_createView_name:
+        var params = ViewManagerServiceCreateViewParams.deserialize(
+            message.payload);
+        var response = _impl.createView(params.viewId,_ViewManagerServiceCreateViewResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kViewManagerService_createView_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kViewManagerService_createView_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      case kViewManagerService_deleteView_name:
+        var params = ViewManagerServiceDeleteViewParams.deserialize(
+            message.payload);
+        var response = _impl.deleteView(params.viewId,_ViewManagerServiceDeleteViewResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kViewManagerService_deleteView_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kViewManagerService_deleteView_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      case kViewManagerService_setViewBounds_name:
+        var params = ViewManagerServiceSetViewBoundsParams.deserialize(
+            message.payload);
+        var response = _impl.setViewBounds(params.viewId,params.bounds,_ViewManagerServiceSetViewBoundsResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kViewManagerService_setViewBounds_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kViewManagerService_setViewBounds_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      case kViewManagerService_setViewVisibility_name:
+        var params = ViewManagerServiceSetViewVisibilityParams.deserialize(
+            message.payload);
+        var response = _impl.setViewVisibility(params.viewId,params.visible,_ViewManagerServiceSetViewVisibilityResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kViewManagerService_setViewVisibility_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kViewManagerService_setViewVisibility_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      case kViewManagerService_setViewProperty_name:
+        var params = ViewManagerServiceSetViewPropertyParams.deserialize(
+            message.payload);
+        var response = _impl.setViewProperty(params.viewId,params.name,params.value,_ViewManagerServiceSetViewPropertyResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kViewManagerService_setViewProperty_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kViewManagerService_setViewProperty_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      case kViewManagerService_addView_name:
+        var params = ViewManagerServiceAddViewParams.deserialize(
+            message.payload);
+        var response = _impl.addView(params.parent,params.child,_ViewManagerServiceAddViewResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kViewManagerService_addView_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kViewManagerService_addView_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      case kViewManagerService_removeViewFromParent_name:
+        var params = ViewManagerServiceRemoveViewFromParentParams.deserialize(
+            message.payload);
+        var response = _impl.removeViewFromParent(params.viewId,_ViewManagerServiceRemoveViewFromParentResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kViewManagerService_removeViewFromParent_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kViewManagerService_removeViewFromParent_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      case kViewManagerService_reorderView_name:
+        var params = ViewManagerServiceReorderViewParams.deserialize(
+            message.payload);
+        var response = _impl.reorderView(params.viewId,params.relativeViewId,params.direction,_ViewManagerServiceReorderViewResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kViewManagerService_reorderView_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kViewManagerService_reorderView_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      case kViewManagerService_getViewTree_name:
+        var params = ViewManagerServiceGetViewTreeParams.deserialize(
+            message.payload);
+        var response = _impl.getViewTree(params.viewId,_ViewManagerServiceGetViewTreeResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kViewManagerService_getViewTree_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kViewManagerService_getViewTree_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      case kViewManagerService_setViewSurfaceId_name:
+        var params = ViewManagerServiceSetViewSurfaceIdParams.deserialize(
+            message.payload);
+        var response = _impl.setViewSurfaceId(params.viewId,params.surfaceId,_ViewManagerServiceSetViewSurfaceIdResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kViewManagerService_setViewSurfaceId_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kViewManagerService_setViewSurfaceId_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      case kViewManagerService_embedUrl_name:
+        var params = ViewManagerServiceEmbedUrlParams.deserialize(
+            message.payload);
+        var response = _impl.embedUrl(params.url,params.viewId,params.services,params.exposedServices,_ViewManagerServiceEmbedUrlResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kViewManagerService_embedUrl_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kViewManagerService_embedUrl_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      case kViewManagerService_embed_name:
+        var params = ViewManagerServiceEmbedParams.deserialize(
+            message.payload);
+        var response = _impl.embed(params.viewId,params.client,_ViewManagerServiceEmbedResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kViewManagerService_embed_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kViewManagerService_embed_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      case kViewManagerService_performAction_name:
+        var params = ViewManagerServicePerformActionParams.deserialize(
+            message.payload);
+        var response = _impl.performAction(params.viewId,params.action,_ViewManagerServicePerformActionResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kViewManagerService_performAction_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kViewManagerService_performAction_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  ViewManagerService get impl => _impl;
+  set impl(ViewManagerService d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "ViewManagerServiceStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+const int kViewManagerClient_onEmbed_name = 0;
+const int kViewManagerClient_onEmbeddedAppDisconnected_name = 1;
+const int kViewManagerClient_onViewBoundsChanged_name = 2;
+const int kViewManagerClient_onViewViewportMetricsChanged_name = 3;
+const int kViewManagerClient_onViewHierarchyChanged_name = 4;
+const int kViewManagerClient_onViewReordered_name = 5;
+const int kViewManagerClient_onViewDeleted_name = 6;
+const int kViewManagerClient_onViewVisibilityChanged_name = 7;
+const int kViewManagerClient_onViewDrawnStateChanged_name = 8;
+const int kViewManagerClient_onViewSharedPropertyChanged_name = 9;
+const int kViewManagerClient_onViewInputEvent_name = 10;
+const int kViewManagerClient_onPerformAction_name = 11;
+
+const String ViewManagerClientName =
+      'mojo::ViewManagerClient';
+
+abstract class ViewManagerClient {
+  void onEmbed(int connectionId, String embedderUrl, ViewData root, Object viewManagerService, Object services, Object exposedServices, core.MojoMessagePipeEndpoint windowManagerPipe);
+  void onEmbeddedAppDisconnected(int view);
+  void onViewBoundsChanged(int view, geometry_mojom.Rect oldBounds, geometry_mojom.Rect newBounds);
+  void onViewViewportMetricsChanged(native_viewport_mojom.ViewportMetrics oldMetrics, native_viewport_mojom.ViewportMetrics newMetrics);
+  void onViewHierarchyChanged(int view, int newParent, int oldParent, List<ViewData> views);
+  void onViewReordered(int viewId, int relativeViewId, view_manager_constants_mojom.OrderDirection direction);
+  void onViewDeleted(int view);
+  void onViewVisibilityChanged(int view, bool visible);
+  void onViewDrawnStateChanged(int view, bool drawn);
+  void onViewSharedPropertyChanged(int view, String name, List<int> newData);
+  dynamic onViewInputEvent(int view,input_events_mojom.Event event,[Function responseFactory = null]);
+  dynamic onPerformAction(int viewId,String action,[Function responseFactory = null]);
+
+}
+
+
+class ViewManagerClientProxyImpl extends bindings.Proxy {
+  ViewManagerClientProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  ViewManagerClientProxyImpl.fromHandle(core.MojoHandle handle) :
+      super.fromHandle(handle);
+
+  ViewManagerClientProxyImpl.unbound() : super.unbound();
+
+  static ViewManagerClientProxyImpl newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ViewManagerClientProxyImpl"));
+    return new ViewManagerClientProxyImpl.fromEndpoint(endpoint);
+  }
+
+  String get name => ViewManagerClientName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      case kViewManagerClient_onViewInputEvent_name:
+        var r = ViewManagerClientOnViewInputEventResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      case kViewManagerClient_onPerformAction_name:
+        var r = ViewManagerClientOnPerformActionResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "ViewManagerClientProxyImpl($superString)";
+  }
+}
+
+
+class _ViewManagerClientProxyCalls implements ViewManagerClient {
+  ViewManagerClientProxyImpl _proxyImpl;
+
+  _ViewManagerClientProxyCalls(this._proxyImpl);
+    void onEmbed(int connectionId, String embedderUrl, ViewData root, Object viewManagerService, Object services, Object exposedServices, core.MojoMessagePipeEndpoint windowManagerPipe) {
+      if (!_proxyImpl.isBound) {
+        _proxyImpl.proxyError("The Proxy is closed.");
+        return;
+      }
+      var params = new ViewManagerClientOnEmbedParams();
+      params.connectionId = connectionId;
+      params.embedderUrl = embedderUrl;
+      params.root = root;
+      params.viewManagerService = viewManagerService;
+      params.services = services;
+      params.exposedServices = exposedServices;
+      params.windowManagerPipe = windowManagerPipe;
+      _proxyImpl.sendMessage(params, kViewManagerClient_onEmbed_name);
+    }
+  
+    void onEmbeddedAppDisconnected(int view) {
+      if (!_proxyImpl.isBound) {
+        _proxyImpl.proxyError("The Proxy is closed.");
+        return;
+      }
+      var params = new ViewManagerClientOnEmbeddedAppDisconnectedParams();
+      params.view = view;
+      _proxyImpl.sendMessage(params, kViewManagerClient_onEmbeddedAppDisconnected_name);
+    }
+  
+    void onViewBoundsChanged(int view, geometry_mojom.Rect oldBounds, geometry_mojom.Rect newBounds) {
+      if (!_proxyImpl.isBound) {
+        _proxyImpl.proxyError("The Proxy is closed.");
+        return;
+      }
+      var params = new ViewManagerClientOnViewBoundsChangedParams();
+      params.view = view;
+      params.oldBounds = oldBounds;
+      params.newBounds = newBounds;
+      _proxyImpl.sendMessage(params, kViewManagerClient_onViewBoundsChanged_name);
+    }
+  
+    void onViewViewportMetricsChanged(native_viewport_mojom.ViewportMetrics oldMetrics, native_viewport_mojom.ViewportMetrics newMetrics) {
+      if (!_proxyImpl.isBound) {
+        _proxyImpl.proxyError("The Proxy is closed.");
+        return;
+      }
+      var params = new ViewManagerClientOnViewViewportMetricsChangedParams();
+      params.oldMetrics = oldMetrics;
+      params.newMetrics = newMetrics;
+      _proxyImpl.sendMessage(params, kViewManagerClient_onViewViewportMetricsChanged_name);
+    }
+  
+    void onViewHierarchyChanged(int view, int newParent, int oldParent, List<ViewData> views) {
+      if (!_proxyImpl.isBound) {
+        _proxyImpl.proxyError("The Proxy is closed.");
+        return;
+      }
+      var params = new ViewManagerClientOnViewHierarchyChangedParams();
+      params.view = view;
+      params.newParent = newParent;
+      params.oldParent = oldParent;
+      params.views = views;
+      _proxyImpl.sendMessage(params, kViewManagerClient_onViewHierarchyChanged_name);
+    }
+  
+    void onViewReordered(int viewId, int relativeViewId, view_manager_constants_mojom.OrderDirection direction) {
+      if (!_proxyImpl.isBound) {
+        _proxyImpl.proxyError("The Proxy is closed.");
+        return;
+      }
+      var params = new ViewManagerClientOnViewReorderedParams();
+      params.viewId = viewId;
+      params.relativeViewId = relativeViewId;
+      params.direction = direction;
+      _proxyImpl.sendMessage(params, kViewManagerClient_onViewReordered_name);
+    }
+  
+    void onViewDeleted(int view) {
+      if (!_proxyImpl.isBound) {
+        _proxyImpl.proxyError("The Proxy is closed.");
+        return;
+      }
+      var params = new ViewManagerClientOnViewDeletedParams();
+      params.view = view;
+      _proxyImpl.sendMessage(params, kViewManagerClient_onViewDeleted_name);
+    }
+  
+    void onViewVisibilityChanged(int view, bool visible) {
+      if (!_proxyImpl.isBound) {
+        _proxyImpl.proxyError("The Proxy is closed.");
+        return;
+      }
+      var params = new ViewManagerClientOnViewVisibilityChangedParams();
+      params.view = view;
+      params.visible = visible;
+      _proxyImpl.sendMessage(params, kViewManagerClient_onViewVisibilityChanged_name);
+    }
+  
+    void onViewDrawnStateChanged(int view, bool drawn) {
+      if (!_proxyImpl.isBound) {
+        _proxyImpl.proxyError("The Proxy is closed.");
+        return;
+      }
+      var params = new ViewManagerClientOnViewDrawnStateChangedParams();
+      params.view = view;
+      params.drawn = drawn;
+      _proxyImpl.sendMessage(params, kViewManagerClient_onViewDrawnStateChanged_name);
+    }
+  
+    void onViewSharedPropertyChanged(int view, String name, List<int> newData) {
+      if (!_proxyImpl.isBound) {
+        _proxyImpl.proxyError("The Proxy is closed.");
+        return;
+      }
+      var params = new ViewManagerClientOnViewSharedPropertyChangedParams();
+      params.view = view;
+      params.name = name;
+      params.newData = newData;
+      _proxyImpl.sendMessage(params, kViewManagerClient_onViewSharedPropertyChanged_name);
+    }
+  
+    dynamic onViewInputEvent(int view,input_events_mojom.Event event,[Function responseFactory = null]) {
+      var params = new ViewManagerClientOnViewInputEventParams();
+      params.view = view;
+      params.event = event;
+      return _proxyImpl.sendMessageWithRequestId(
+          params,
+          kViewManagerClient_onViewInputEvent_name,
+          -1,
+          bindings.MessageHeader.kMessageExpectsResponse);
+    }
+    dynamic onPerformAction(int viewId,String action,[Function responseFactory = null]) {
+      var params = new ViewManagerClientOnPerformActionParams();
+      params.viewId = viewId;
+      params.action = action;
+      return _proxyImpl.sendMessageWithRequestId(
+          params,
+          kViewManagerClient_onPerformAction_name,
+          -1,
+          bindings.MessageHeader.kMessageExpectsResponse);
+    }
+}
+
+
+class ViewManagerClientProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  ViewManagerClient ptr;
+  final String name = ViewManagerClientName;
+
+  ViewManagerClientProxy(ViewManagerClientProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _ViewManagerClientProxyCalls(proxyImpl);
+
+  ViewManagerClientProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new ViewManagerClientProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _ViewManagerClientProxyCalls(impl);
+  }
+
+  ViewManagerClientProxy.fromHandle(core.MojoHandle handle) :
+      impl = new ViewManagerClientProxyImpl.fromHandle(handle) {
+    ptr = new _ViewManagerClientProxyCalls(impl);
+  }
+
+  ViewManagerClientProxy.unbound() :
+      impl = new ViewManagerClientProxyImpl.unbound() {
+    ptr = new _ViewManagerClientProxyCalls(impl);
+  }
+
+  factory ViewManagerClientProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    ViewManagerClientProxy p = new ViewManagerClientProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static ViewManagerClientProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ViewManagerClientProxy"));
+    return new ViewManagerClientProxy.fromEndpoint(endpoint);
+  }
+
+  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 "ViewManagerClientProxy($impl)";
+  }
+}
+
+
+class ViewManagerClientStub extends bindings.Stub {
+  ViewManagerClient _impl = null;
+
+  ViewManagerClientStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  ViewManagerClientStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  ViewManagerClientStub.unbound() : super.unbound();
+
+  static ViewManagerClientStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ViewManagerClientStub"));
+    return new ViewManagerClientStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = ViewManagerClientName;
+
+
+  ViewManagerClientOnViewInputEventResponseParams _ViewManagerClientOnViewInputEventResponseParamsFactory() {
+    var result = new ViewManagerClientOnViewInputEventResponseParams();
+    return result;
+  }
+  ViewManagerClientOnPerformActionResponseParams _ViewManagerClientOnPerformActionResponseParamsFactory(bool success) {
+    var result = new ViewManagerClientOnPerformActionResponseParams();
+    result.success = success;
+    return result;
+  }
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      case kViewManagerClient_onEmbed_name:
+        var params = ViewManagerClientOnEmbedParams.deserialize(
+            message.payload);
+        _impl.onEmbed(params.connectionId, params.embedderUrl, params.root, params.viewManagerService, params.services, params.exposedServices, params.windowManagerPipe);
+        break;
+      case kViewManagerClient_onEmbeddedAppDisconnected_name:
+        var params = ViewManagerClientOnEmbeddedAppDisconnectedParams.deserialize(
+            message.payload);
+        _impl.onEmbeddedAppDisconnected(params.view);
+        break;
+      case kViewManagerClient_onViewBoundsChanged_name:
+        var params = ViewManagerClientOnViewBoundsChangedParams.deserialize(
+            message.payload);
+        _impl.onViewBoundsChanged(params.view, params.oldBounds, params.newBounds);
+        break;
+      case kViewManagerClient_onViewViewportMetricsChanged_name:
+        var params = ViewManagerClientOnViewViewportMetricsChangedParams.deserialize(
+            message.payload);
+        _impl.onViewViewportMetricsChanged(params.oldMetrics, params.newMetrics);
+        break;
+      case kViewManagerClient_onViewHierarchyChanged_name:
+        var params = ViewManagerClientOnViewHierarchyChangedParams.deserialize(
+            message.payload);
+        _impl.onViewHierarchyChanged(params.view, params.newParent, params.oldParent, params.views);
+        break;
+      case kViewManagerClient_onViewReordered_name:
+        var params = ViewManagerClientOnViewReorderedParams.deserialize(
+            message.payload);
+        _impl.onViewReordered(params.viewId, params.relativeViewId, params.direction);
+        break;
+      case kViewManagerClient_onViewDeleted_name:
+        var params = ViewManagerClientOnViewDeletedParams.deserialize(
+            message.payload);
+        _impl.onViewDeleted(params.view);
+        break;
+      case kViewManagerClient_onViewVisibilityChanged_name:
+        var params = ViewManagerClientOnViewVisibilityChangedParams.deserialize(
+            message.payload);
+        _impl.onViewVisibilityChanged(params.view, params.visible);
+        break;
+      case kViewManagerClient_onViewDrawnStateChanged_name:
+        var params = ViewManagerClientOnViewDrawnStateChangedParams.deserialize(
+            message.payload);
+        _impl.onViewDrawnStateChanged(params.view, params.drawn);
+        break;
+      case kViewManagerClient_onViewSharedPropertyChanged_name:
+        var params = ViewManagerClientOnViewSharedPropertyChangedParams.deserialize(
+            message.payload);
+        _impl.onViewSharedPropertyChanged(params.view, params.name, params.newData);
+        break;
+      case kViewManagerClient_onViewInputEvent_name:
+        var params = ViewManagerClientOnViewInputEventParams.deserialize(
+            message.payload);
+        var response = _impl.onViewInputEvent(params.view,params.event,_ViewManagerClientOnViewInputEventResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kViewManagerClient_onViewInputEvent_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kViewManagerClient_onViewInputEvent_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      case kViewManagerClient_onPerformAction_name:
+        var params = ViewManagerClientOnPerformActionParams.deserialize(
+            message.payload);
+        var response = _impl.onPerformAction(params.viewId,params.action,_ViewManagerClientOnPerformActionResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kViewManagerClient_onPerformAction_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kViewManagerClient_onPerformAction_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  ViewManagerClient get impl => _impl;
+  set impl(ViewManagerClient d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "ViewManagerClientStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/view_manager_constants.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/view_manager_constants.mojom.dart
new file mode 100644
index 0000000..0f45bf4
--- /dev/null
+++ b/mojo/dart/packages/mojo_services/lib/mojo/view_manager_constants.mojom.dart
@@ -0,0 +1,62 @@
+// 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.
+
+library view_manager_constants_mojom;
+
+import 'dart:async';
+
+import 'package:mojo/bindings.dart' as bindings;
+import 'package:mojo/core.dart' as core;
+class OrderDirection extends bindings.MojoEnum {
+  static const ABOVE = const OrderDirection._(1);
+  static const BELOW = const OrderDirection._(2);
+
+  const OrderDirection._(int v) : super(v);
+
+  static const Map<String, OrderDirection> valuesMap = const {
+    "ABOVE": ABOVE,
+    "BELOW": BELOW,
+  };
+  static const List<OrderDirection> values = const [
+    ABOVE,
+    BELOW,
+  ];
+
+  static OrderDirection valueOf(String name) => valuesMap[name];
+
+  factory OrderDirection(int v) {
+    switch (v) {
+      case 1:
+        return ABOVE;
+      case 2:
+        return BELOW;
+      default:
+        return null;
+    }
+  }
+
+  static OrderDirection decode(bindings.Decoder decoder0, int offset) {
+    int v = decoder0.decodeUint32(offset);
+    OrderDirection result = new OrderDirection(v);
+    if (result == null) {
+      throw new bindings.MojoCodecError(
+          'Bad value $v for enum OrderDirection.');
+    }
+    return result;
+  }
+
+  String toString() {
+    switch(this) {
+      case ABOVE:
+        return 'OrderDirection.ABOVE';
+      case BELOW:
+        return 'OrderDirection.BELOW';
+    }
+  }
+
+  int toJson() => value;
+}
+
+
+
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/viewport_parameter_listener.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/viewport_parameter_listener.mojom.dart
new file mode 100644
index 0000000..095f21c
--- /dev/null
+++ b/mojo/dart/packages/mojo_services/lib/mojo/viewport_parameter_listener.mojom.dart
@@ -0,0 +1,265 @@
+// 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.
+
+library viewport_parameter_listener_mojom;
+
+import 'dart:async';
+
+import 'package:mojo/bindings.dart' as bindings;
+import 'package:mojo/core.dart' as core;
+
+
+
+class ViewportParameterListenerOnVSyncParametersUpdatedParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  int timebase = 0;
+  int interval = 0;
+
+  ViewportParameterListenerOnVSyncParametersUpdatedParams() : super(kVersions.last.size);
+
+  static ViewportParameterListenerOnVSyncParametersUpdatedParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ViewportParameterListenerOnVSyncParametersUpdatedParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ViewportParameterListenerOnVSyncParametersUpdatedParams result = new ViewportParameterListenerOnVSyncParametersUpdatedParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.timebase = decoder0.decodeInt64(8);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.interval = decoder0.decodeInt64(16);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeInt64(timebase, 8);
+    
+    encoder0.encodeInt64(interval, 16);
+  }
+
+  String toString() {
+    return "ViewportParameterListenerOnVSyncParametersUpdatedParams("
+           "timebase: $timebase" ", "
+           "interval: $interval" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["timebase"] = timebase;
+    map["interval"] = interval;
+    return map;
+  }
+}
+
+const int kViewportParameterListener_onVSyncParametersUpdated_name = 0;
+
+const String ViewportParameterListenerName =
+      'mojo::ViewportParameterListener';
+
+abstract class ViewportParameterListener {
+  void onVSyncParametersUpdated(int timebase, int interval);
+
+}
+
+
+class ViewportParameterListenerProxyImpl extends bindings.Proxy {
+  ViewportParameterListenerProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  ViewportParameterListenerProxyImpl.fromHandle(core.MojoHandle handle) :
+      super.fromHandle(handle);
+
+  ViewportParameterListenerProxyImpl.unbound() : super.unbound();
+
+  static ViewportParameterListenerProxyImpl newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ViewportParameterListenerProxyImpl"));
+    return new ViewportParameterListenerProxyImpl.fromEndpoint(endpoint);
+  }
+
+  String get name => ViewportParameterListenerName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "ViewportParameterListenerProxyImpl($superString)";
+  }
+}
+
+
+class _ViewportParameterListenerProxyCalls implements ViewportParameterListener {
+  ViewportParameterListenerProxyImpl _proxyImpl;
+
+  _ViewportParameterListenerProxyCalls(this._proxyImpl);
+    void onVSyncParametersUpdated(int timebase, int interval) {
+      if (!_proxyImpl.isBound) {
+        _proxyImpl.proxyError("The Proxy is closed.");
+        return;
+      }
+      var params = new ViewportParameterListenerOnVSyncParametersUpdatedParams();
+      params.timebase = timebase;
+      params.interval = interval;
+      _proxyImpl.sendMessage(params, kViewportParameterListener_onVSyncParametersUpdated_name);
+    }
+  
+}
+
+
+class ViewportParameterListenerProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  ViewportParameterListener ptr;
+  final String name = ViewportParameterListenerName;
+
+  ViewportParameterListenerProxy(ViewportParameterListenerProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _ViewportParameterListenerProxyCalls(proxyImpl);
+
+  ViewportParameterListenerProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new ViewportParameterListenerProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _ViewportParameterListenerProxyCalls(impl);
+  }
+
+  ViewportParameterListenerProxy.fromHandle(core.MojoHandle handle) :
+      impl = new ViewportParameterListenerProxyImpl.fromHandle(handle) {
+    ptr = new _ViewportParameterListenerProxyCalls(impl);
+  }
+
+  ViewportParameterListenerProxy.unbound() :
+      impl = new ViewportParameterListenerProxyImpl.unbound() {
+    ptr = new _ViewportParameterListenerProxyCalls(impl);
+  }
+
+  factory ViewportParameterListenerProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    ViewportParameterListenerProxy p = new ViewportParameterListenerProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static ViewportParameterListenerProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ViewportParameterListenerProxy"));
+    return new ViewportParameterListenerProxy.fromEndpoint(endpoint);
+  }
+
+  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 "ViewportParameterListenerProxy($impl)";
+  }
+}
+
+
+class ViewportParameterListenerStub extends bindings.Stub {
+  ViewportParameterListener _impl = null;
+
+  ViewportParameterListenerStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  ViewportParameterListenerStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  ViewportParameterListenerStub.unbound() : super.unbound();
+
+  static ViewportParameterListenerStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ViewportParameterListenerStub"));
+    return new ViewportParameterListenerStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = ViewportParameterListenerName;
+
+
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      case kViewportParameterListener_onVSyncParametersUpdated_name:
+        var params = ViewportParameterListenerOnVSyncParametersUpdatedParams.deserialize(
+            message.payload);
+        _impl.onVSyncParametersUpdated(params.timebase, params.interval);
+        break;
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  ViewportParameterListener get impl => _impl;
+  set impl(ViewportParameterListener d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "ViewportParameterListenerStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+
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
new file mode 100644
index 0000000..53ddcaa
--- /dev/null
+++ b/mojo/dart/packages/mojo_services/lib/mojo/web_socket.mojom.dart
@@ -0,0 +1,1289 @@
+// 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.
+
+library web_socket_mojom;
+
+import 'dart:async';
+
+import 'package:mojo/bindings.dart' as bindings;
+import 'package:mojo/core.dart' as core;
+import 'package:mojo/mojo/network_error.mojom.dart' as network_error_mojom;
+
+
+
+class WebSocketConnectParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(48, 0)
+  ];
+  String url = null;
+  List<String> protocols = null;
+  String origin = null;
+  core.MojoDataPipeConsumer sendStream = null;
+  Object client = null;
+
+  WebSocketConnectParams() : super(kVersions.last.size);
+
+  static WebSocketConnectParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static WebSocketConnectParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    WebSocketConnectParams result = new WebSocketConnectParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.url = decoder0.decodeString(8, false);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(16, false);
+      {
+        var si1 = decoder1.decodeDataHeaderForPointerArray(bindings.kUnspecifiedArrayLength);
+        result.protocols = new List<String>(si1.numElements);
+        for (int i1 = 0; i1 < si1.numElements; ++i1) {
+          
+          result.protocols[i1] = decoder1.decodeString(bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i1, false);
+        }
+      }
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.origin = decoder0.decodeString(24, false);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.sendStream = decoder0.decodeConsumerHandle(32, false);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.client = decoder0.decodeServiceInterface(36, false, WebSocketClientProxy.newFromEndpoint);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeString(url, 8, false);
+    
+    if (protocols == null) {
+      encoder0.encodeNullPointer(16, false);
+    } else {
+      var encoder1 = encoder0.encodePointerArray(protocols.length, 16, bindings.kUnspecifiedArrayLength);
+      for (int i0 = 0; i0 < protocols.length; ++i0) {
+        
+        encoder1.encodeString(protocols[i0], bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i0, false);
+      }
+    }
+    
+    encoder0.encodeString(origin, 24, false);
+    
+    encoder0.encodeConsumerHandle(sendStream, 32, false);
+    
+    encoder0.encodeInterface(client, 36, false);
+  }
+
+  String toString() {
+    return "WebSocketConnectParams("
+           "url: $url" ", "
+           "protocols: $protocols" ", "
+           "origin: $origin" ", "
+           "sendStream: $sendStream" ", "
+           "client: $client" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+
+class WebSocketSendParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  bool fin = false;
+  WebSocketMessageType type = null;
+  int numBytes = 0;
+
+  WebSocketSendParams() : super(kVersions.last.size);
+
+  static WebSocketSendParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static WebSocketSendParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    WebSocketSendParams result = new WebSocketSendParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.fin = decoder0.decodeBool(8, 0);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+        result.type = WebSocketMessageType.decode(decoder0, 12);
+        if (result.type == null) {
+          throw new bindings.MojoCodecError(
+            'Trying to decode null union for non-nullable WebSocketMessageType.');
+        }
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.numBytes = decoder0.decodeUint32(16);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeBool(fin, 8, 0);
+    
+    encoder0.encodeEnum(type, 12);
+    
+    encoder0.encodeUint32(numBytes, 16);
+  }
+
+  String toString() {
+    return "WebSocketSendParams("
+           "fin: $fin" ", "
+           "type: $type" ", "
+           "numBytes: $numBytes" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["fin"] = fin;
+    map["type"] = type;
+    map["numBytes"] = numBytes;
+    return map;
+  }
+}
+
+
+class WebSocketFlowControlParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  int quota = 0;
+
+  WebSocketFlowControlParams() : super(kVersions.last.size);
+
+  static WebSocketFlowControlParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static WebSocketFlowControlParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    WebSocketFlowControlParams result = new WebSocketFlowControlParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.quota = decoder0.decodeInt64(8);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeInt64(quota, 8);
+  }
+
+  String toString() {
+    return "WebSocketFlowControlParams("
+           "quota: $quota" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["quota"] = quota;
+    return map;
+  }
+}
+
+
+class WebSocketCloseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  int code = 0;
+  String reason = null;
+
+  WebSocketCloseParams() : super(kVersions.last.size);
+
+  static WebSocketCloseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static WebSocketCloseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    WebSocketCloseParams result = new WebSocketCloseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.code = decoder0.decodeUint16(8);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.reason = decoder0.decodeString(16, false);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeUint16(code, 8);
+    
+    encoder0.encodeString(reason, 16, false);
+  }
+
+  String toString() {
+    return "WebSocketCloseParams("
+           "code: $code" ", "
+           "reason: $reason" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["code"] = code;
+    map["reason"] = reason;
+    return map;
+  }
+}
+
+
+class WebSocketClientDidConnectParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(32, 0)
+  ];
+  String selectedSubprotocol = null;
+  String extensions = null;
+  core.MojoDataPipeConsumer receiveStream = null;
+
+  WebSocketClientDidConnectParams() : super(kVersions.last.size);
+
+  static WebSocketClientDidConnectParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static WebSocketClientDidConnectParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    WebSocketClientDidConnectParams result = new WebSocketClientDidConnectParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.selectedSubprotocol = decoder0.decodeString(8, false);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.extensions = decoder0.decodeString(16, false);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.receiveStream = decoder0.decodeConsumerHandle(24, false);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeString(selectedSubprotocol, 8, false);
+    
+    encoder0.encodeString(extensions, 16, false);
+    
+    encoder0.encodeConsumerHandle(receiveStream, 24, false);
+  }
+
+  String toString() {
+    return "WebSocketClientDidConnectParams("
+           "selectedSubprotocol: $selectedSubprotocol" ", "
+           "extensions: $extensions" ", "
+           "receiveStream: $receiveStream" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+
+class WebSocketClientDidReceiveDataParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  bool fin = false;
+  WebSocketMessageType type = null;
+  int numBytes = 0;
+
+  WebSocketClientDidReceiveDataParams() : super(kVersions.last.size);
+
+  static WebSocketClientDidReceiveDataParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static WebSocketClientDidReceiveDataParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    WebSocketClientDidReceiveDataParams result = new WebSocketClientDidReceiveDataParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.fin = decoder0.decodeBool(8, 0);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+        result.type = WebSocketMessageType.decode(decoder0, 12);
+        if (result.type == null) {
+          throw new bindings.MojoCodecError(
+            'Trying to decode null union for non-nullable WebSocketMessageType.');
+        }
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.numBytes = decoder0.decodeUint32(16);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeBool(fin, 8, 0);
+    
+    encoder0.encodeEnum(type, 12);
+    
+    encoder0.encodeUint32(numBytes, 16);
+  }
+
+  String toString() {
+    return "WebSocketClientDidReceiveDataParams("
+           "fin: $fin" ", "
+           "type: $type" ", "
+           "numBytes: $numBytes" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["fin"] = fin;
+    map["type"] = type;
+    map["numBytes"] = numBytes;
+    return map;
+  }
+}
+
+
+class WebSocketClientDidReceiveFlowControlParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  int quota = 0;
+
+  WebSocketClientDidReceiveFlowControlParams() : super(kVersions.last.size);
+
+  static WebSocketClientDidReceiveFlowControlParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static WebSocketClientDidReceiveFlowControlParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    WebSocketClientDidReceiveFlowControlParams result = new WebSocketClientDidReceiveFlowControlParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.quota = decoder0.decodeInt64(8);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeInt64(quota, 8);
+  }
+
+  String toString() {
+    return "WebSocketClientDidReceiveFlowControlParams("
+           "quota: $quota" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["quota"] = quota;
+    return map;
+  }
+}
+
+
+class WebSocketClientDidFailParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  String message = null;
+
+  WebSocketClientDidFailParams() : super(kVersions.last.size);
+
+  static WebSocketClientDidFailParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static WebSocketClientDidFailParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    WebSocketClientDidFailParams result = new WebSocketClientDidFailParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.message = decoder0.decodeString(8, false);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeString(message, 8, false);
+  }
+
+  String toString() {
+    return "WebSocketClientDidFailParams("
+           "message: $message" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["message"] = message;
+    return map;
+  }
+}
+
+
+class WebSocketClientDidCloseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  bool wasClean = false;
+  int code = 0;
+  String reason = null;
+
+  WebSocketClientDidCloseParams() : super(kVersions.last.size);
+
+  static WebSocketClientDidCloseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static WebSocketClientDidCloseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    WebSocketClientDidCloseParams result = new WebSocketClientDidCloseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.wasClean = decoder0.decodeBool(8, 0);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.code = decoder0.decodeUint16(10);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.reason = decoder0.decodeString(16, false);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeBool(wasClean, 8, 0);
+    
+    encoder0.encodeUint16(code, 10);
+    
+    encoder0.encodeString(reason, 16, false);
+  }
+
+  String toString() {
+    return "WebSocketClientDidCloseParams("
+           "wasClean: $wasClean" ", "
+           "code: $code" ", "
+           "reason: $reason" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["wasClean"] = wasClean;
+    map["code"] = code;
+    map["reason"] = reason;
+    return map;
+  }
+}
+
+const int kWebSocket_connect_name = 0;
+const int kWebSocket_send_name = 1;
+const int kWebSocket_flowControl_name = 2;
+const int kWebSocket_close_name = 3;
+
+const String WebSocketName =
+      'mojo::WebSocket';
+  class WebSocketMessageType extends bindings.MojoEnum {
+  static const CONTINUATION = const WebSocketMessageType._(0);
+  static const TEXT = const WebSocketMessageType._(1);
+  static const BINARY = const WebSocketMessageType._(2);
+
+  const WebSocketMessageType._(int v) : super(v);
+
+  static const Map<String, WebSocketMessageType> valuesMap = const {
+    "CONTINUATION": CONTINUATION,
+    "TEXT": TEXT,
+    "BINARY": BINARY,
+  };
+  static const List<WebSocketMessageType> values = const [
+    CONTINUATION,
+    TEXT,
+    BINARY,
+  ];
+
+  static WebSocketMessageType valueOf(String name) => valuesMap[name];
+
+  factory WebSocketMessageType(int v) {
+    switch (v) {
+      case 0:
+        return CONTINUATION;
+      case 1:
+        return TEXT;
+      case 2:
+        return BINARY;
+      default:
+        return null;
+    }
+  }
+
+  static WebSocketMessageType decode(bindings.Decoder decoder0, int offset) {
+    int v = decoder0.decodeUint32(offset);
+    WebSocketMessageType result = new WebSocketMessageType(v);
+    if (result == null) {
+      throw new bindings.MojoCodecError(
+          'Bad value $v for enum WebSocketMessageType.');
+    }
+    return result;
+  }
+
+  String toString() {
+    switch(this) {
+      case CONTINUATION:
+        return 'WebSocketMessageType.CONTINUATION';
+      case TEXT:
+        return 'WebSocketMessageType.TEXT';
+      case BINARY:
+        return 'WebSocketMessageType.BINARY';
+    }
+  }
+
+  int toJson() => value;
+}
+
+abstract class WebSocket {
+  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);
+
+  static const ABNORMAL_CLOSE_CODE = 1006;
+}
+
+
+class WebSocketProxyImpl extends bindings.Proxy {
+  WebSocketProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  WebSocketProxyImpl.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);
+  }
+
+  String get name => WebSocketName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "WebSocketProxyImpl($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, kWebSocket_connect_name);
+    }
+  
+    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, kWebSocket_send_name);
+    }
+  
+    void flowControl(int quota) {
+      if (!_proxyImpl.isBound) {
+        _proxyImpl.proxyError("The Proxy is closed.");
+        return;
+      }
+      var params = new WebSocketFlowControlParams();
+      params.quota = quota;
+      _proxyImpl.sendMessage(params, kWebSocket_flowControl_name);
+    }
+  
+    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, kWebSocket_close_name);
+    }
+  
+}
+
+
+class WebSocketProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  WebSocket ptr;
+  final String name = WebSocketName;
+
+  WebSocketProxy(WebSocketProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _WebSocketProxyCalls(proxyImpl);
+
+  WebSocketProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new WebSocketProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _WebSocketProxyCalls(impl);
+  }
+
+  WebSocketProxy.fromHandle(core.MojoHandle handle) :
+      impl = new WebSocketProxyImpl.fromHandle(handle) {
+    ptr = new _WebSocketProxyCalls(impl);
+  }
+
+  WebSocketProxy.unbound() :
+      impl = new WebSocketProxyImpl.unbound() {
+    ptr = new _WebSocketProxyCalls(impl);
+  }
+
+  factory WebSocketProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    WebSocketProxy p = new WebSocketProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static WebSocketProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For WebSocketProxy"));
+    return new WebSocketProxy.fromEndpoint(endpoint);
+  }
+
+  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 "WebSocketProxy($impl)";
+  }
+}
+
+
+class WebSocketStub extends bindings.Stub {
+  WebSocket _impl = null;
+
+  WebSocketStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  WebSocketStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  WebSocketStub.unbound() : super.unbound();
+
+  static WebSocketStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For WebSocketStub"));
+    return new WebSocketStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = WebSocketName;
+
+
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      case kWebSocket_connect_name:
+        var params = WebSocketConnectParams.deserialize(
+            message.payload);
+        _impl.connect(params.url, params.protocols, params.origin, params.sendStream, params.client);
+        break;
+      case kWebSocket_send_name:
+        var params = WebSocketSendParams.deserialize(
+            message.payload);
+        _impl.send(params.fin, params.type, params.numBytes);
+        break;
+      case kWebSocket_flowControl_name:
+        var params = WebSocketFlowControlParams.deserialize(
+            message.payload);
+        _impl.flowControl(params.quota);
+        break;
+      case kWebSocket_close_name:
+        var params = WebSocketCloseParams.deserialize(
+            message.payload);
+        _impl.close(params.code, params.reason);
+        break;
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  WebSocket get impl => _impl;
+  set impl(WebSocket d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "WebSocketStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+const int kWebSocketClient_didConnect_name = 0;
+const int kWebSocketClient_didReceiveData_name = 1;
+const int kWebSocketClient_didReceiveFlowControl_name = 2;
+const int kWebSocketClient_didFail_name = 3;
+const int kWebSocketClient_didClose_name = 4;
+
+const String WebSocketClientName =
+      'mojo::WebSocketClient';
+
+abstract class WebSocketClient {
+  void didConnect(String selectedSubprotocol, String extensions, core.MojoDataPipeConsumer receiveStream);
+  void didReceiveData(bool fin, WebSocketMessageType type, int numBytes);
+  void didReceiveFlowControl(int quota);
+  void didFail(String message);
+  void didClose(bool wasClean, int code, String reason);
+
+}
+
+
+class WebSocketClientProxyImpl extends bindings.Proxy {
+  WebSocketClientProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  WebSocketClientProxyImpl.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);
+  }
+
+  String get name => WebSocketClientName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "WebSocketClientProxyImpl($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, kWebSocketClient_didConnect_name);
+    }
+  
+    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, kWebSocketClient_didReceiveData_name);
+    }
+  
+    void didReceiveFlowControl(int quota) {
+      if (!_proxyImpl.isBound) {
+        _proxyImpl.proxyError("The Proxy is closed.");
+        return;
+      }
+      var params = new WebSocketClientDidReceiveFlowControlParams();
+      params.quota = quota;
+      _proxyImpl.sendMessage(params, kWebSocketClient_didReceiveFlowControl_name);
+    }
+  
+    void didFail(String message) {
+      if (!_proxyImpl.isBound) {
+        _proxyImpl.proxyError("The Proxy is closed.");
+        return;
+      }
+      var params = new WebSocketClientDidFailParams();
+      params.message = message;
+      _proxyImpl.sendMessage(params, kWebSocketClient_didFail_name);
+    }
+  
+    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, kWebSocketClient_didClose_name);
+    }
+  
+}
+
+
+class WebSocketClientProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  WebSocketClient ptr;
+  final String name = WebSocketClientName;
+
+  WebSocketClientProxy(WebSocketClientProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _WebSocketClientProxyCalls(proxyImpl);
+
+  WebSocketClientProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new WebSocketClientProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _WebSocketClientProxyCalls(impl);
+  }
+
+  WebSocketClientProxy.fromHandle(core.MojoHandle handle) :
+      impl = new WebSocketClientProxyImpl.fromHandle(handle) {
+    ptr = new _WebSocketClientProxyCalls(impl);
+  }
+
+  WebSocketClientProxy.unbound() :
+      impl = new WebSocketClientProxyImpl.unbound() {
+    ptr = new _WebSocketClientProxyCalls(impl);
+  }
+
+  factory WebSocketClientProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    WebSocketClientProxy p = new WebSocketClientProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static WebSocketClientProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For WebSocketClientProxy"));
+    return new WebSocketClientProxy.fromEndpoint(endpoint);
+  }
+
+  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 "WebSocketClientProxy($impl)";
+  }
+}
+
+
+class WebSocketClientStub extends bindings.Stub {
+  WebSocketClient _impl = null;
+
+  WebSocketClientStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  WebSocketClientStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  WebSocketClientStub.unbound() : super.unbound();
+
+  static WebSocketClientStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For WebSocketClientStub"));
+    return new WebSocketClientStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = WebSocketClientName;
+
+
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      case kWebSocketClient_didConnect_name:
+        var params = WebSocketClientDidConnectParams.deserialize(
+            message.payload);
+        _impl.didConnect(params.selectedSubprotocol, params.extensions, params.receiveStream);
+        break;
+      case kWebSocketClient_didReceiveData_name:
+        var params = WebSocketClientDidReceiveDataParams.deserialize(
+            message.payload);
+        _impl.didReceiveData(params.fin, params.type, params.numBytes);
+        break;
+      case kWebSocketClient_didReceiveFlowControl_name:
+        var params = WebSocketClientDidReceiveFlowControlParams.deserialize(
+            message.payload);
+        _impl.didReceiveFlowControl(params.quota);
+        break;
+      case kWebSocketClient_didFail_name:
+        var params = WebSocketClientDidFailParams.deserialize(
+            message.payload);
+        _impl.didFail(params.message);
+        break;
+      case kWebSocketClient_didClose_name:
+        var params = WebSocketClientDidCloseParams.deserialize(
+            message.payload);
+        _impl.didClose(params.wasClean, params.code, params.reason);
+        break;
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  WebSocketClient get impl => _impl;
+  set impl(WebSocketClient d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "WebSocketClientStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/window_manager.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/window_manager.mojom.dart
new file mode 100644
index 0000000..df1b4e7
--- /dev/null
+++ b/mojo/dart/packages/mojo_services/lib/mojo/window_manager.mojom.dart
@@ -0,0 +1,1471 @@
+// 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.
+
+library window_manager_mojom;
+
+import 'dart:async';
+
+import 'package:mojo/bindings.dart' as bindings;
+import 'package:mojo/core.dart' as core;
+import 'package:mojo_services/mojo/input_events.mojom.dart' as input_events_mojom;
+import 'package:mojo/mojo/service_provider.mojom.dart' as service_provider_mojom;
+
+
+
+class WindowManagerEmbedParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(32, 0)
+  ];
+  String url = null;
+  Object services = null;
+  Object exposedServices = null;
+
+  WindowManagerEmbedParams() : super(kVersions.last.size);
+
+  static WindowManagerEmbedParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static WindowManagerEmbedParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    WindowManagerEmbedParams result = new WindowManagerEmbedParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.url = decoder0.decodeString(8, false);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.services = decoder0.decodeInterfaceRequest(16, true, service_provider_mojom.ServiceProviderStub.newFromEndpoint);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.exposedServices = decoder0.decodeServiceInterface(20, true, service_provider_mojom.ServiceProviderProxy.newFromEndpoint);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeString(url, 8, false);
+    
+    encoder0.encodeInterfaceRequest(services, 16, true);
+    
+    encoder0.encodeInterface(exposedServices, 20, true);
+  }
+
+  String toString() {
+    return "WindowManagerEmbedParams("
+           "url: $url" ", "
+           "services: $services" ", "
+           "exposedServices: $exposedServices" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+
+class WindowManagerSetCaptureParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  int viewId = 0;
+
+  WindowManagerSetCaptureParams() : super(kVersions.last.size);
+
+  static WindowManagerSetCaptureParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static WindowManagerSetCaptureParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    WindowManagerSetCaptureParams result = new WindowManagerSetCaptureParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.viewId = decoder0.decodeUint32(8);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeUint32(viewId, 8);
+  }
+
+  String toString() {
+    return "WindowManagerSetCaptureParams("
+           "viewId: $viewId" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["viewId"] = viewId;
+    return map;
+  }
+}
+
+
+class WindowManagerSetCaptureResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  bool success = false;
+
+  WindowManagerSetCaptureResponseParams() : super(kVersions.last.size);
+
+  static WindowManagerSetCaptureResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static WindowManagerSetCaptureResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    WindowManagerSetCaptureResponseParams result = new WindowManagerSetCaptureResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.success = decoder0.decodeBool(8, 0);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeBool(success, 8, 0);
+  }
+
+  String toString() {
+    return "WindowManagerSetCaptureResponseParams("
+           "success: $success" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["success"] = success;
+    return map;
+  }
+}
+
+
+class WindowManagerFocusWindowParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  int viewId = 0;
+
+  WindowManagerFocusWindowParams() : super(kVersions.last.size);
+
+  static WindowManagerFocusWindowParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static WindowManagerFocusWindowParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    WindowManagerFocusWindowParams result = new WindowManagerFocusWindowParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.viewId = decoder0.decodeUint32(8);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeUint32(viewId, 8);
+  }
+
+  String toString() {
+    return "WindowManagerFocusWindowParams("
+           "viewId: $viewId" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["viewId"] = viewId;
+    return map;
+  }
+}
+
+
+class WindowManagerFocusWindowResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  bool success = false;
+
+  WindowManagerFocusWindowResponseParams() : super(kVersions.last.size);
+
+  static WindowManagerFocusWindowResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static WindowManagerFocusWindowResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    WindowManagerFocusWindowResponseParams result = new WindowManagerFocusWindowResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.success = decoder0.decodeBool(8, 0);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeBool(success, 8, 0);
+  }
+
+  String toString() {
+    return "WindowManagerFocusWindowResponseParams("
+           "success: $success" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["success"] = success;
+    return map;
+  }
+}
+
+
+class WindowManagerActivateWindowParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  int viewId = 0;
+
+  WindowManagerActivateWindowParams() : super(kVersions.last.size);
+
+  static WindowManagerActivateWindowParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static WindowManagerActivateWindowParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    WindowManagerActivateWindowParams result = new WindowManagerActivateWindowParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.viewId = decoder0.decodeUint32(8);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeUint32(viewId, 8);
+  }
+
+  String toString() {
+    return "WindowManagerActivateWindowParams("
+           "viewId: $viewId" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["viewId"] = viewId;
+    return map;
+  }
+}
+
+
+class WindowManagerActivateWindowResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  bool success = false;
+
+  WindowManagerActivateWindowResponseParams() : super(kVersions.last.size);
+
+  static WindowManagerActivateWindowResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static WindowManagerActivateWindowResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    WindowManagerActivateWindowResponseParams result = new WindowManagerActivateWindowResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.success = decoder0.decodeBool(8, 0);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeBool(success, 8, 0);
+  }
+
+  String toString() {
+    return "WindowManagerActivateWindowResponseParams("
+           "success: $success" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["success"] = success;
+    return map;
+  }
+}
+
+
+class WindowManagerGetFocusedAndActiveViewsParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  Object observer = null;
+
+  WindowManagerGetFocusedAndActiveViewsParams() : super(kVersions.last.size);
+
+  static WindowManagerGetFocusedAndActiveViewsParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static WindowManagerGetFocusedAndActiveViewsParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    WindowManagerGetFocusedAndActiveViewsParams result = new WindowManagerGetFocusedAndActiveViewsParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.observer = decoder0.decodeServiceInterface(8, true, WindowManagerObserverProxy.newFromEndpoint);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeInterface(observer, 8, true);
+  }
+
+  String toString() {
+    return "WindowManagerGetFocusedAndActiveViewsParams("
+           "observer: $observer" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+
+class WindowManagerGetFocusedAndActiveViewsResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  int captureViewId = 0;
+  int focusedViewId = 0;
+  int activeViewId = 0;
+
+  WindowManagerGetFocusedAndActiveViewsResponseParams() : super(kVersions.last.size);
+
+  static WindowManagerGetFocusedAndActiveViewsResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static WindowManagerGetFocusedAndActiveViewsResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    WindowManagerGetFocusedAndActiveViewsResponseParams result = new WindowManagerGetFocusedAndActiveViewsResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.captureViewId = decoder0.decodeUint32(8);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.focusedViewId = decoder0.decodeUint32(12);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.activeViewId = decoder0.decodeUint32(16);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeUint32(captureViewId, 8);
+    
+    encoder0.encodeUint32(focusedViewId, 12);
+    
+    encoder0.encodeUint32(activeViewId, 16);
+  }
+
+  String toString() {
+    return "WindowManagerGetFocusedAndActiveViewsResponseParams("
+           "captureViewId: $captureViewId" ", "
+           "focusedViewId: $focusedViewId" ", "
+           "activeViewId: $activeViewId" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["captureViewId"] = captureViewId;
+    map["focusedViewId"] = focusedViewId;
+    map["activeViewId"] = activeViewId;
+    return map;
+  }
+}
+
+
+class WindowManagerObserverOnCaptureChangedParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  int captureViewId = 0;
+
+  WindowManagerObserverOnCaptureChangedParams() : super(kVersions.last.size);
+
+  static WindowManagerObserverOnCaptureChangedParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static WindowManagerObserverOnCaptureChangedParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    WindowManagerObserverOnCaptureChangedParams result = new WindowManagerObserverOnCaptureChangedParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.captureViewId = decoder0.decodeUint32(8);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeUint32(captureViewId, 8);
+  }
+
+  String toString() {
+    return "WindowManagerObserverOnCaptureChangedParams("
+           "captureViewId: $captureViewId" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["captureViewId"] = captureViewId;
+    return map;
+  }
+}
+
+
+class WindowManagerObserverOnFocusChangedParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  int focusedViewId = 0;
+
+  WindowManagerObserverOnFocusChangedParams() : super(kVersions.last.size);
+
+  static WindowManagerObserverOnFocusChangedParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static WindowManagerObserverOnFocusChangedParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    WindowManagerObserverOnFocusChangedParams result = new WindowManagerObserverOnFocusChangedParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.focusedViewId = decoder0.decodeUint32(8);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeUint32(focusedViewId, 8);
+  }
+
+  String toString() {
+    return "WindowManagerObserverOnFocusChangedParams("
+           "focusedViewId: $focusedViewId" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["focusedViewId"] = focusedViewId;
+    return map;
+  }
+}
+
+
+class WindowManagerObserverOnActiveWindowChangedParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  int focusedViewId = 0;
+
+  WindowManagerObserverOnActiveWindowChangedParams() : super(kVersions.last.size);
+
+  static WindowManagerObserverOnActiveWindowChangedParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static WindowManagerObserverOnActiveWindowChangedParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    WindowManagerObserverOnActiveWindowChangedParams result = new WindowManagerObserverOnActiveWindowChangedParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.focusedViewId = decoder0.decodeUint32(8);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeUint32(focusedViewId, 8);
+  }
+
+  String toString() {
+    return "WindowManagerObserverOnActiveWindowChangedParams("
+           "focusedViewId: $focusedViewId" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["focusedViewId"] = focusedViewId;
+    return map;
+  }
+}
+
+const int kWindowManager_embed_name = 0;
+const int kWindowManager_setCapture_name = 1;
+const int kWindowManager_focusWindow_name = 2;
+const int kWindowManager_activateWindow_name = 3;
+const int kWindowManager_getFocusedAndActiveViews_name = 4;
+
+const String WindowManagerName =
+      'mojo::WindowManager';
+
+abstract class WindowManager {
+  void embed(String url, Object services, Object exposedServices);
+  dynamic setCapture(int viewId,[Function responseFactory = null]);
+  dynamic focusWindow(int viewId,[Function responseFactory = null]);
+  dynamic activateWindow(int viewId,[Function responseFactory = null]);
+  dynamic getFocusedAndActiveViews(Object observer,[Function responseFactory = null]);
+
+}
+
+
+class WindowManagerProxyImpl extends bindings.Proxy {
+  WindowManagerProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  WindowManagerProxyImpl.fromHandle(core.MojoHandle handle) :
+      super.fromHandle(handle);
+
+  WindowManagerProxyImpl.unbound() : super.unbound();
+
+  static WindowManagerProxyImpl newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For WindowManagerProxyImpl"));
+    return new WindowManagerProxyImpl.fromEndpoint(endpoint);
+  }
+
+  String get name => WindowManagerName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      case kWindowManager_setCapture_name:
+        var r = WindowManagerSetCaptureResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      case kWindowManager_focusWindow_name:
+        var r = WindowManagerFocusWindowResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      case kWindowManager_activateWindow_name:
+        var r = WindowManagerActivateWindowResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      case kWindowManager_getFocusedAndActiveViews_name:
+        var r = WindowManagerGetFocusedAndActiveViewsResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "WindowManagerProxyImpl($superString)";
+  }
+}
+
+
+class _WindowManagerProxyCalls implements WindowManager {
+  WindowManagerProxyImpl _proxyImpl;
+
+  _WindowManagerProxyCalls(this._proxyImpl);
+    void embed(String url, Object services, Object exposedServices) {
+      if (!_proxyImpl.isBound) {
+        _proxyImpl.proxyError("The Proxy is closed.");
+        return;
+      }
+      var params = new WindowManagerEmbedParams();
+      params.url = url;
+      params.services = services;
+      params.exposedServices = exposedServices;
+      _proxyImpl.sendMessage(params, kWindowManager_embed_name);
+    }
+  
+    dynamic setCapture(int viewId,[Function responseFactory = null]) {
+      var params = new WindowManagerSetCaptureParams();
+      params.viewId = viewId;
+      return _proxyImpl.sendMessageWithRequestId(
+          params,
+          kWindowManager_setCapture_name,
+          -1,
+          bindings.MessageHeader.kMessageExpectsResponse);
+    }
+    dynamic focusWindow(int viewId,[Function responseFactory = null]) {
+      var params = new WindowManagerFocusWindowParams();
+      params.viewId = viewId;
+      return _proxyImpl.sendMessageWithRequestId(
+          params,
+          kWindowManager_focusWindow_name,
+          -1,
+          bindings.MessageHeader.kMessageExpectsResponse);
+    }
+    dynamic activateWindow(int viewId,[Function responseFactory = null]) {
+      var params = new WindowManagerActivateWindowParams();
+      params.viewId = viewId;
+      return _proxyImpl.sendMessageWithRequestId(
+          params,
+          kWindowManager_activateWindow_name,
+          -1,
+          bindings.MessageHeader.kMessageExpectsResponse);
+    }
+    dynamic getFocusedAndActiveViews(Object observer,[Function responseFactory = null]) {
+      var params = new WindowManagerGetFocusedAndActiveViewsParams();
+      params.observer = observer;
+      return _proxyImpl.sendMessageWithRequestId(
+          params,
+          kWindowManager_getFocusedAndActiveViews_name,
+          -1,
+          bindings.MessageHeader.kMessageExpectsResponse);
+    }
+}
+
+
+class WindowManagerProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  WindowManager ptr;
+  final String name = WindowManagerName;
+
+  WindowManagerProxy(WindowManagerProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _WindowManagerProxyCalls(proxyImpl);
+
+  WindowManagerProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new WindowManagerProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _WindowManagerProxyCalls(impl);
+  }
+
+  WindowManagerProxy.fromHandle(core.MojoHandle handle) :
+      impl = new WindowManagerProxyImpl.fromHandle(handle) {
+    ptr = new _WindowManagerProxyCalls(impl);
+  }
+
+  WindowManagerProxy.unbound() :
+      impl = new WindowManagerProxyImpl.unbound() {
+    ptr = new _WindowManagerProxyCalls(impl);
+  }
+
+  factory WindowManagerProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    WindowManagerProxy p = new WindowManagerProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static WindowManagerProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For WindowManagerProxy"));
+    return new WindowManagerProxy.fromEndpoint(endpoint);
+  }
+
+  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 "WindowManagerProxy($impl)";
+  }
+}
+
+
+class WindowManagerStub extends bindings.Stub {
+  WindowManager _impl = null;
+
+  WindowManagerStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  WindowManagerStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  WindowManagerStub.unbound() : super.unbound();
+
+  static WindowManagerStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For WindowManagerStub"));
+    return new WindowManagerStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = WindowManagerName;
+
+
+  WindowManagerSetCaptureResponseParams _WindowManagerSetCaptureResponseParamsFactory(bool success) {
+    var result = new WindowManagerSetCaptureResponseParams();
+    result.success = success;
+    return result;
+  }
+  WindowManagerFocusWindowResponseParams _WindowManagerFocusWindowResponseParamsFactory(bool success) {
+    var result = new WindowManagerFocusWindowResponseParams();
+    result.success = success;
+    return result;
+  }
+  WindowManagerActivateWindowResponseParams _WindowManagerActivateWindowResponseParamsFactory(bool success) {
+    var result = new WindowManagerActivateWindowResponseParams();
+    result.success = success;
+    return result;
+  }
+  WindowManagerGetFocusedAndActiveViewsResponseParams _WindowManagerGetFocusedAndActiveViewsResponseParamsFactory(int captureViewId, int focusedViewId, int activeViewId) {
+    var result = new WindowManagerGetFocusedAndActiveViewsResponseParams();
+    result.captureViewId = captureViewId;
+    result.focusedViewId = focusedViewId;
+    result.activeViewId = activeViewId;
+    return result;
+  }
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      case kWindowManager_embed_name:
+        var params = WindowManagerEmbedParams.deserialize(
+            message.payload);
+        _impl.embed(params.url, params.services, params.exposedServices);
+        break;
+      case kWindowManager_setCapture_name:
+        var params = WindowManagerSetCaptureParams.deserialize(
+            message.payload);
+        var response = _impl.setCapture(params.viewId,_WindowManagerSetCaptureResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kWindowManager_setCapture_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kWindowManager_setCapture_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      case kWindowManager_focusWindow_name:
+        var params = WindowManagerFocusWindowParams.deserialize(
+            message.payload);
+        var response = _impl.focusWindow(params.viewId,_WindowManagerFocusWindowResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kWindowManager_focusWindow_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kWindowManager_focusWindow_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      case kWindowManager_activateWindow_name:
+        var params = WindowManagerActivateWindowParams.deserialize(
+            message.payload);
+        var response = _impl.activateWindow(params.viewId,_WindowManagerActivateWindowResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kWindowManager_activateWindow_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kWindowManager_activateWindow_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      case kWindowManager_getFocusedAndActiveViews_name:
+        var params = WindowManagerGetFocusedAndActiveViewsParams.deserialize(
+            message.payload);
+        var response = _impl.getFocusedAndActiveViews(params.observer,_WindowManagerGetFocusedAndActiveViewsResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kWindowManager_getFocusedAndActiveViews_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kWindowManager_getFocusedAndActiveViews_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  WindowManager get impl => _impl;
+  set impl(WindowManager d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "WindowManagerStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+const int kWindowManagerObserver_onCaptureChanged_name = 0;
+const int kWindowManagerObserver_onFocusChanged_name = 1;
+const int kWindowManagerObserver_onActiveWindowChanged_name = 2;
+
+const String WindowManagerObserverName =
+      'mojo::WindowManagerObserver';
+
+abstract class WindowManagerObserver {
+  void onCaptureChanged(int captureViewId);
+  void onFocusChanged(int focusedViewId);
+  void onActiveWindowChanged(int focusedViewId);
+
+}
+
+
+class WindowManagerObserverProxyImpl extends bindings.Proxy {
+  WindowManagerObserverProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  WindowManagerObserverProxyImpl.fromHandle(core.MojoHandle handle) :
+      super.fromHandle(handle);
+
+  WindowManagerObserverProxyImpl.unbound() : super.unbound();
+
+  static WindowManagerObserverProxyImpl newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For WindowManagerObserverProxyImpl"));
+    return new WindowManagerObserverProxyImpl.fromEndpoint(endpoint);
+  }
+
+  String get name => WindowManagerObserverName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "WindowManagerObserverProxyImpl($superString)";
+  }
+}
+
+
+class _WindowManagerObserverProxyCalls implements WindowManagerObserver {
+  WindowManagerObserverProxyImpl _proxyImpl;
+
+  _WindowManagerObserverProxyCalls(this._proxyImpl);
+    void onCaptureChanged(int captureViewId) {
+      if (!_proxyImpl.isBound) {
+        _proxyImpl.proxyError("The Proxy is closed.");
+        return;
+      }
+      var params = new WindowManagerObserverOnCaptureChangedParams();
+      params.captureViewId = captureViewId;
+      _proxyImpl.sendMessage(params, kWindowManagerObserver_onCaptureChanged_name);
+    }
+  
+    void onFocusChanged(int focusedViewId) {
+      if (!_proxyImpl.isBound) {
+        _proxyImpl.proxyError("The Proxy is closed.");
+        return;
+      }
+      var params = new WindowManagerObserverOnFocusChangedParams();
+      params.focusedViewId = focusedViewId;
+      _proxyImpl.sendMessage(params, kWindowManagerObserver_onFocusChanged_name);
+    }
+  
+    void onActiveWindowChanged(int focusedViewId) {
+      if (!_proxyImpl.isBound) {
+        _proxyImpl.proxyError("The Proxy is closed.");
+        return;
+      }
+      var params = new WindowManagerObserverOnActiveWindowChangedParams();
+      params.focusedViewId = focusedViewId;
+      _proxyImpl.sendMessage(params, kWindowManagerObserver_onActiveWindowChanged_name);
+    }
+  
+}
+
+
+class WindowManagerObserverProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  WindowManagerObserver ptr;
+  final String name = WindowManagerObserverName;
+
+  WindowManagerObserverProxy(WindowManagerObserverProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _WindowManagerObserverProxyCalls(proxyImpl);
+
+  WindowManagerObserverProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new WindowManagerObserverProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _WindowManagerObserverProxyCalls(impl);
+  }
+
+  WindowManagerObserverProxy.fromHandle(core.MojoHandle handle) :
+      impl = new WindowManagerObserverProxyImpl.fromHandle(handle) {
+    ptr = new _WindowManagerObserverProxyCalls(impl);
+  }
+
+  WindowManagerObserverProxy.unbound() :
+      impl = new WindowManagerObserverProxyImpl.unbound() {
+    ptr = new _WindowManagerObserverProxyCalls(impl);
+  }
+
+  factory WindowManagerObserverProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    WindowManagerObserverProxy p = new WindowManagerObserverProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static WindowManagerObserverProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For WindowManagerObserverProxy"));
+    return new WindowManagerObserverProxy.fromEndpoint(endpoint);
+  }
+
+  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 "WindowManagerObserverProxy($impl)";
+  }
+}
+
+
+class WindowManagerObserverStub extends bindings.Stub {
+  WindowManagerObserver _impl = null;
+
+  WindowManagerObserverStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  WindowManagerObserverStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  WindowManagerObserverStub.unbound() : super.unbound();
+
+  static WindowManagerObserverStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For WindowManagerObserverStub"));
+    return new WindowManagerObserverStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = WindowManagerObserverName;
+
+
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      case kWindowManagerObserver_onCaptureChanged_name:
+        var params = WindowManagerObserverOnCaptureChangedParams.deserialize(
+            message.payload);
+        _impl.onCaptureChanged(params.captureViewId);
+        break;
+      case kWindowManagerObserver_onFocusChanged_name:
+        var params = WindowManagerObserverOnFocusChangedParams.deserialize(
+            message.payload);
+        _impl.onFocusChanged(params.focusedViewId);
+        break;
+      case kWindowManagerObserver_onActiveWindowChanged_name:
+        var params = WindowManagerObserverOnActiveWindowChangedParams.deserialize(
+            message.payload);
+        _impl.onActiveWindowChanged(params.focusedViewId);
+        break;
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  WindowManagerObserver get impl => _impl;
+  set impl(WindowManagerObserver d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "WindowManagerObserverStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/window_manager_internal.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/window_manager_internal.mojom.dart
new file mode 100644
index 0000000..16645a4
--- /dev/null
+++ b/mojo/dart/packages/mojo_services/lib/mojo/window_manager_internal.mojom.dart
@@ -0,0 +1,770 @@
+// 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.
+
+library window_manager_internal_mojom;
+
+import 'dart:async';
+
+import 'package:mojo/bindings.dart' as bindings;
+import 'package:mojo/core.dart' as core;
+import 'package:mojo_services/mojo/geometry.mojom.dart' as geometry_mojom;
+import 'package:mojo_services/mojo/input_events.mojom.dart' as input_events_mojom;
+
+
+
+class WindowManagerInternalCreateWindowManagerForViewManagerClientParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  int connectionId = 0;
+  core.MojoMessagePipeEndpoint windowManagerPipe = null;
+
+  WindowManagerInternalCreateWindowManagerForViewManagerClientParams() : super(kVersions.last.size);
+
+  static WindowManagerInternalCreateWindowManagerForViewManagerClientParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static WindowManagerInternalCreateWindowManagerForViewManagerClientParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    WindowManagerInternalCreateWindowManagerForViewManagerClientParams result = new WindowManagerInternalCreateWindowManagerForViewManagerClientParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.connectionId = decoder0.decodeUint16(8);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.windowManagerPipe = decoder0.decodeMessagePipeHandle(12, false);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeUint16(connectionId, 8);
+    
+    encoder0.encodeMessagePipeHandle(windowManagerPipe, 12, false);
+  }
+
+  String toString() {
+    return "WindowManagerInternalCreateWindowManagerForViewManagerClientParams("
+           "connectionId: $connectionId" ", "
+           "windowManagerPipe: $windowManagerPipe" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+
+class WindowManagerInternalSetViewManagerClientParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  core.MojoMessagePipeEndpoint viewManagerClientRequest = null;
+
+  WindowManagerInternalSetViewManagerClientParams() : super(kVersions.last.size);
+
+  static WindowManagerInternalSetViewManagerClientParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static WindowManagerInternalSetViewManagerClientParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    WindowManagerInternalSetViewManagerClientParams result = new WindowManagerInternalSetViewManagerClientParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.viewManagerClientRequest = decoder0.decodeMessagePipeHandle(8, false);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeMessagePipeHandle(viewManagerClientRequest, 8, false);
+  }
+
+  String toString() {
+    return "WindowManagerInternalSetViewManagerClientParams("
+           "viewManagerClientRequest: $viewManagerClientRequest" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+
+class WindowManagerInternalClientDispatchInputEventToViewParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  int viewId = 0;
+  input_events_mojom.Event event = null;
+
+  WindowManagerInternalClientDispatchInputEventToViewParams() : super(kVersions.last.size);
+
+  static WindowManagerInternalClientDispatchInputEventToViewParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static WindowManagerInternalClientDispatchInputEventToViewParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    WindowManagerInternalClientDispatchInputEventToViewParams result = new WindowManagerInternalClientDispatchInputEventToViewParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.viewId = decoder0.decodeUint32(8);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(16, false);
+      result.event = input_events_mojom.Event.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeUint32(viewId, 8);
+    
+    encoder0.encodeStruct(event, 16, false);
+  }
+
+  String toString() {
+    return "WindowManagerInternalClientDispatchInputEventToViewParams("
+           "viewId: $viewId" ", "
+           "event: $event" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["viewId"] = viewId;
+    map["event"] = event;
+    return map;
+  }
+}
+
+
+class WindowManagerInternalClientSetViewportSizeParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  geometry_mojom.Size size = null;
+
+  WindowManagerInternalClientSetViewportSizeParams() : super(kVersions.last.size);
+
+  static WindowManagerInternalClientSetViewportSizeParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static WindowManagerInternalClientSetViewportSizeParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    WindowManagerInternalClientSetViewportSizeParams result = new WindowManagerInternalClientSetViewportSizeParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, false);
+      result.size = geometry_mojom.Size.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(size, 8, false);
+  }
+
+  String toString() {
+    return "WindowManagerInternalClientSetViewportSizeParams("
+           "size: $size" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["size"] = size;
+    return map;
+  }
+}
+
+
+class WindowManagerInternalClientCloneAndAnimateParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  int viewId = 0;
+
+  WindowManagerInternalClientCloneAndAnimateParams() : super(kVersions.last.size);
+
+  static WindowManagerInternalClientCloneAndAnimateParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static WindowManagerInternalClientCloneAndAnimateParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    WindowManagerInternalClientCloneAndAnimateParams result = new WindowManagerInternalClientCloneAndAnimateParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.viewId = decoder0.decodeUint32(8);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeUint32(viewId, 8);
+  }
+
+  String toString() {
+    return "WindowManagerInternalClientCloneAndAnimateParams("
+           "viewId: $viewId" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["viewId"] = viewId;
+    return map;
+  }
+}
+
+const int kWindowManagerInternal_createWindowManagerForViewManagerClient_name = 0;
+const int kWindowManagerInternal_setViewManagerClient_name = 1;
+
+const String WindowManagerInternalName =
+      'mojo::WindowManagerInternal';
+
+abstract class WindowManagerInternal {
+  void createWindowManagerForViewManagerClient(int connectionId, core.MojoMessagePipeEndpoint windowManagerPipe);
+  void setViewManagerClient(core.MojoMessagePipeEndpoint viewManagerClientRequest);
+
+}
+
+
+class WindowManagerInternalProxyImpl extends bindings.Proxy {
+  WindowManagerInternalProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  WindowManagerInternalProxyImpl.fromHandle(core.MojoHandle handle) :
+      super.fromHandle(handle);
+
+  WindowManagerInternalProxyImpl.unbound() : super.unbound();
+
+  static WindowManagerInternalProxyImpl newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For WindowManagerInternalProxyImpl"));
+    return new WindowManagerInternalProxyImpl.fromEndpoint(endpoint);
+  }
+
+  String get name => WindowManagerInternalName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "WindowManagerInternalProxyImpl($superString)";
+  }
+}
+
+
+class _WindowManagerInternalProxyCalls implements WindowManagerInternal {
+  WindowManagerInternalProxyImpl _proxyImpl;
+
+  _WindowManagerInternalProxyCalls(this._proxyImpl);
+    void createWindowManagerForViewManagerClient(int connectionId, core.MojoMessagePipeEndpoint windowManagerPipe) {
+      if (!_proxyImpl.isBound) {
+        _proxyImpl.proxyError("The Proxy is closed.");
+        return;
+      }
+      var params = new WindowManagerInternalCreateWindowManagerForViewManagerClientParams();
+      params.connectionId = connectionId;
+      params.windowManagerPipe = windowManagerPipe;
+      _proxyImpl.sendMessage(params, kWindowManagerInternal_createWindowManagerForViewManagerClient_name);
+    }
+  
+    void setViewManagerClient(core.MojoMessagePipeEndpoint viewManagerClientRequest) {
+      if (!_proxyImpl.isBound) {
+        _proxyImpl.proxyError("The Proxy is closed.");
+        return;
+      }
+      var params = new WindowManagerInternalSetViewManagerClientParams();
+      params.viewManagerClientRequest = viewManagerClientRequest;
+      _proxyImpl.sendMessage(params, kWindowManagerInternal_setViewManagerClient_name);
+    }
+  
+}
+
+
+class WindowManagerInternalProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  WindowManagerInternal ptr;
+  final String name = WindowManagerInternalName;
+
+  WindowManagerInternalProxy(WindowManagerInternalProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _WindowManagerInternalProxyCalls(proxyImpl);
+
+  WindowManagerInternalProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new WindowManagerInternalProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _WindowManagerInternalProxyCalls(impl);
+  }
+
+  WindowManagerInternalProxy.fromHandle(core.MojoHandle handle) :
+      impl = new WindowManagerInternalProxyImpl.fromHandle(handle) {
+    ptr = new _WindowManagerInternalProxyCalls(impl);
+  }
+
+  WindowManagerInternalProxy.unbound() :
+      impl = new WindowManagerInternalProxyImpl.unbound() {
+    ptr = new _WindowManagerInternalProxyCalls(impl);
+  }
+
+  factory WindowManagerInternalProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    WindowManagerInternalProxy p = new WindowManagerInternalProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static WindowManagerInternalProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For WindowManagerInternalProxy"));
+    return new WindowManagerInternalProxy.fromEndpoint(endpoint);
+  }
+
+  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 "WindowManagerInternalProxy($impl)";
+  }
+}
+
+
+class WindowManagerInternalStub extends bindings.Stub {
+  WindowManagerInternal _impl = null;
+
+  WindowManagerInternalStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  WindowManagerInternalStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  WindowManagerInternalStub.unbound() : super.unbound();
+
+  static WindowManagerInternalStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For WindowManagerInternalStub"));
+    return new WindowManagerInternalStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = WindowManagerInternalName;
+
+
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      case kWindowManagerInternal_createWindowManagerForViewManagerClient_name:
+        var params = WindowManagerInternalCreateWindowManagerForViewManagerClientParams.deserialize(
+            message.payload);
+        _impl.createWindowManagerForViewManagerClient(params.connectionId, params.windowManagerPipe);
+        break;
+      case kWindowManagerInternal_setViewManagerClient_name:
+        var params = WindowManagerInternalSetViewManagerClientParams.deserialize(
+            message.payload);
+        _impl.setViewManagerClient(params.viewManagerClientRequest);
+        break;
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  WindowManagerInternal get impl => _impl;
+  set impl(WindowManagerInternal d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "WindowManagerInternalStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+const int kWindowManagerInternalClient_dispatchInputEventToView_name = 0;
+const int kWindowManagerInternalClient_setViewportSize_name = 1;
+const int kWindowManagerInternalClient_cloneAndAnimate_name = 2;
+
+const String WindowManagerInternalClientName =
+      'mojo::WindowManagerInternalClient';
+
+abstract class WindowManagerInternalClient {
+  void dispatchInputEventToView(int viewId, input_events_mojom.Event event);
+  void setViewportSize(geometry_mojom.Size size);
+  void cloneAndAnimate(int viewId);
+
+}
+
+
+class WindowManagerInternalClientProxyImpl extends bindings.Proxy {
+  WindowManagerInternalClientProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  WindowManagerInternalClientProxyImpl.fromHandle(core.MojoHandle handle) :
+      super.fromHandle(handle);
+
+  WindowManagerInternalClientProxyImpl.unbound() : super.unbound();
+
+  static WindowManagerInternalClientProxyImpl newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For WindowManagerInternalClientProxyImpl"));
+    return new WindowManagerInternalClientProxyImpl.fromEndpoint(endpoint);
+  }
+
+  String get name => WindowManagerInternalClientName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "WindowManagerInternalClientProxyImpl($superString)";
+  }
+}
+
+
+class _WindowManagerInternalClientProxyCalls implements WindowManagerInternalClient {
+  WindowManagerInternalClientProxyImpl _proxyImpl;
+
+  _WindowManagerInternalClientProxyCalls(this._proxyImpl);
+    void dispatchInputEventToView(int viewId, input_events_mojom.Event event) {
+      if (!_proxyImpl.isBound) {
+        _proxyImpl.proxyError("The Proxy is closed.");
+        return;
+      }
+      var params = new WindowManagerInternalClientDispatchInputEventToViewParams();
+      params.viewId = viewId;
+      params.event = event;
+      _proxyImpl.sendMessage(params, kWindowManagerInternalClient_dispatchInputEventToView_name);
+    }
+  
+    void setViewportSize(geometry_mojom.Size size) {
+      if (!_proxyImpl.isBound) {
+        _proxyImpl.proxyError("The Proxy is closed.");
+        return;
+      }
+      var params = new WindowManagerInternalClientSetViewportSizeParams();
+      params.size = size;
+      _proxyImpl.sendMessage(params, kWindowManagerInternalClient_setViewportSize_name);
+    }
+  
+    void cloneAndAnimate(int viewId) {
+      if (!_proxyImpl.isBound) {
+        _proxyImpl.proxyError("The Proxy is closed.");
+        return;
+      }
+      var params = new WindowManagerInternalClientCloneAndAnimateParams();
+      params.viewId = viewId;
+      _proxyImpl.sendMessage(params, kWindowManagerInternalClient_cloneAndAnimate_name);
+    }
+  
+}
+
+
+class WindowManagerInternalClientProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  WindowManagerInternalClient ptr;
+  final String name = WindowManagerInternalClientName;
+
+  WindowManagerInternalClientProxy(WindowManagerInternalClientProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _WindowManagerInternalClientProxyCalls(proxyImpl);
+
+  WindowManagerInternalClientProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new WindowManagerInternalClientProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _WindowManagerInternalClientProxyCalls(impl);
+  }
+
+  WindowManagerInternalClientProxy.fromHandle(core.MojoHandle handle) :
+      impl = new WindowManagerInternalClientProxyImpl.fromHandle(handle) {
+    ptr = new _WindowManagerInternalClientProxyCalls(impl);
+  }
+
+  WindowManagerInternalClientProxy.unbound() :
+      impl = new WindowManagerInternalClientProxyImpl.unbound() {
+    ptr = new _WindowManagerInternalClientProxyCalls(impl);
+  }
+
+  factory WindowManagerInternalClientProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    WindowManagerInternalClientProxy p = new WindowManagerInternalClientProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static WindowManagerInternalClientProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For WindowManagerInternalClientProxy"));
+    return new WindowManagerInternalClientProxy.fromEndpoint(endpoint);
+  }
+
+  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 "WindowManagerInternalClientProxy($impl)";
+  }
+}
+
+
+class WindowManagerInternalClientStub extends bindings.Stub {
+  WindowManagerInternalClient _impl = null;
+
+  WindowManagerInternalClientStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  WindowManagerInternalClientStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  WindowManagerInternalClientStub.unbound() : super.unbound();
+
+  static WindowManagerInternalClientStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For WindowManagerInternalClientStub"));
+    return new WindowManagerInternalClientStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = WindowManagerInternalClientName;
+
+
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      case kWindowManagerInternalClient_dispatchInputEventToView_name:
+        var params = WindowManagerInternalClientDispatchInputEventToViewParams.deserialize(
+            message.payload);
+        _impl.dispatchInputEventToView(params.viewId, params.event);
+        break;
+      case kWindowManagerInternalClient_setViewportSize_name:
+        var params = WindowManagerInternalClientSetViewportSizeParams.deserialize(
+            message.payload);
+        _impl.setViewportSize(params.size);
+        break;
+      case kWindowManagerInternalClient_cloneAndAnimate_name:
+        var params = WindowManagerInternalClientCloneAndAnimateParams.deserialize(
+            message.payload);
+        _impl.cloneAndAnimate(params.viewId);
+        break;
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  WindowManagerInternalClient get impl => _impl;
+  set impl(WindowManagerInternalClient d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "WindowManagerInternalClientStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+
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
new file mode 100644
index 0000000..a469c9d
--- /dev/null
+++ b/mojo/dart/packages/mojo_services/lib/native_support/process.mojom.dart
@@ -0,0 +1,1275 @@
+// 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.
+
+library process_mojom;
+
+import 'dart:async';
+
+import 'package:mojo/bindings.dart' as bindings;
+import 'package:mojo/core.dart' as core;
+import 'package:mojo_services/mojo/files/file.mojom.dart' as file_mojom;
+import 'package:mojo_services/mojo/files/types.mojom.dart' as types_mojom;
+
+
+
+class ProcessSpawnParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(64, 0)
+  ];
+  String path = null;
+  List<String> argv = null;
+  List<String> envp = null;
+  Object stdinFile = null;
+  Object stdoutFile = null;
+  Object stderrFile = null;
+  Object processController = null;
+
+  ProcessSpawnParams() : super(kVersions.last.size);
+
+  static ProcessSpawnParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ProcessSpawnParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ProcessSpawnParams result = new ProcessSpawnParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.path = decoder0.decodeString(8, false);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(16, true);
+      if (decoder1 == null) {
+        result.argv = null;
+      } else {
+        var si1 = decoder1.decodeDataHeaderForPointerArray(bindings.kUnspecifiedArrayLength);
+        result.argv = new List<String>(si1.numElements);
+        for (int i1 = 0; i1 < si1.numElements; ++i1) {
+          
+          result.argv[i1] = decoder1.decodeString(bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i1, false);
+        }
+      }
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(24, true);
+      if (decoder1 == null) {
+        result.envp = null;
+      } else {
+        var si1 = decoder1.decodeDataHeaderForPointerArray(bindings.kUnspecifiedArrayLength);
+        result.envp = new List<String>(si1.numElements);
+        for (int i1 = 0; i1 < si1.numElements; ++i1) {
+          
+          result.envp[i1] = decoder1.decodeString(bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i1, false);
+        }
+      }
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.stdinFile = decoder0.decodeServiceInterface(32, true, file_mojom.FileProxy.newFromEndpoint);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.stdoutFile = decoder0.decodeServiceInterface(40, true, file_mojom.FileProxy.newFromEndpoint);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.stderrFile = decoder0.decodeServiceInterface(48, true, file_mojom.FileProxy.newFromEndpoint);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.processController = decoder0.decodeInterfaceRequest(56, false, ProcessControllerStub.newFromEndpoint);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeString(path, 8, false);
+    
+    if (argv == null) {
+      encoder0.encodeNullPointer(16, true);
+    } else {
+      var encoder1 = encoder0.encodePointerArray(argv.length, 16, bindings.kUnspecifiedArrayLength);
+      for (int i0 = 0; i0 < argv.length; ++i0) {
+        
+        encoder1.encodeString(argv[i0], bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i0, false);
+      }
+    }
+    
+    if (envp == null) {
+      encoder0.encodeNullPointer(24, true);
+    } else {
+      var encoder1 = encoder0.encodePointerArray(envp.length, 24, bindings.kUnspecifiedArrayLength);
+      for (int i0 = 0; i0 < envp.length; ++i0) {
+        
+        encoder1.encodeString(envp[i0], bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i0, false);
+      }
+    }
+    
+    encoder0.encodeInterface(stdinFile, 32, true);
+    
+    encoder0.encodeInterface(stdoutFile, 40, true);
+    
+    encoder0.encodeInterface(stderrFile, 48, true);
+    
+    encoder0.encodeInterfaceRequest(processController, 56, false);
+  }
+
+  String toString() {
+    return "ProcessSpawnParams("
+           "path: $path" ", "
+           "argv: $argv" ", "
+           "envp: $envp" ", "
+           "stdinFile: $stdinFile" ", "
+           "stdoutFile: $stdoutFile" ", "
+           "stderrFile: $stderrFile" ", "
+           "processController: $processController" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+
+class ProcessSpawnResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  types_mojom.Error error = null;
+
+  ProcessSpawnResponseParams() : super(kVersions.last.size);
+
+  static ProcessSpawnResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ProcessSpawnResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ProcessSpawnResponseParams result = new ProcessSpawnResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+        result.error = types_mojom.Error.decode(decoder0, 8);
+        if (result.error == null) {
+          throw new bindings.MojoCodecError(
+            'Trying to decode null union for non-nullable types_mojom.Error.');
+        }
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeEnum(error, 8);
+  }
+
+  String toString() {
+    return "ProcessSpawnResponseParams("
+           "error: $error" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["error"] = error;
+    return map;
+  }
+}
+
+
+class ProcessSpawnWithTerminalParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(48, 0)
+  ];
+  String path = null;
+  List<String> argv = null;
+  List<String> envp = null;
+  Object terminalFile = null;
+  Object processController = null;
+
+  ProcessSpawnWithTerminalParams() : super(kVersions.last.size);
+
+  static ProcessSpawnWithTerminalParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ProcessSpawnWithTerminalParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ProcessSpawnWithTerminalParams result = new ProcessSpawnWithTerminalParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.path = decoder0.decodeString(8, false);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(16, true);
+      if (decoder1 == null) {
+        result.argv = null;
+      } else {
+        var si1 = decoder1.decodeDataHeaderForPointerArray(bindings.kUnspecifiedArrayLength);
+        result.argv = new List<String>(si1.numElements);
+        for (int i1 = 0; i1 < si1.numElements; ++i1) {
+          
+          result.argv[i1] = decoder1.decodeString(bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i1, false);
+        }
+      }
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(24, true);
+      if (decoder1 == null) {
+        result.envp = null;
+      } else {
+        var si1 = decoder1.decodeDataHeaderForPointerArray(bindings.kUnspecifiedArrayLength);
+        result.envp = new List<String>(si1.numElements);
+        for (int i1 = 0; i1 < si1.numElements; ++i1) {
+          
+          result.envp[i1] = decoder1.decodeString(bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i1, false);
+        }
+      }
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.terminalFile = decoder0.decodeServiceInterface(32, false, file_mojom.FileProxy.newFromEndpoint);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.processController = decoder0.decodeInterfaceRequest(40, false, ProcessControllerStub.newFromEndpoint);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeString(path, 8, false);
+    
+    if (argv == null) {
+      encoder0.encodeNullPointer(16, true);
+    } else {
+      var encoder1 = encoder0.encodePointerArray(argv.length, 16, bindings.kUnspecifiedArrayLength);
+      for (int i0 = 0; i0 < argv.length; ++i0) {
+        
+        encoder1.encodeString(argv[i0], bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i0, false);
+      }
+    }
+    
+    if (envp == null) {
+      encoder0.encodeNullPointer(24, true);
+    } else {
+      var encoder1 = encoder0.encodePointerArray(envp.length, 24, bindings.kUnspecifiedArrayLength);
+      for (int i0 = 0; i0 < envp.length; ++i0) {
+        
+        encoder1.encodeString(envp[i0], bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i0, false);
+      }
+    }
+    
+    encoder0.encodeInterface(terminalFile, 32, false);
+    
+    encoder0.encodeInterfaceRequest(processController, 40, false);
+  }
+
+  String toString() {
+    return "ProcessSpawnWithTerminalParams("
+           "path: $path" ", "
+           "argv: $argv" ", "
+           "envp: $envp" ", "
+           "terminalFile: $terminalFile" ", "
+           "processController: $processController" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+
+class ProcessSpawnWithTerminalResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  types_mojom.Error error = null;
+
+  ProcessSpawnWithTerminalResponseParams() : super(kVersions.last.size);
+
+  static ProcessSpawnWithTerminalResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ProcessSpawnWithTerminalResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ProcessSpawnWithTerminalResponseParams result = new ProcessSpawnWithTerminalResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+        result.error = types_mojom.Error.decode(decoder0, 8);
+        if (result.error == null) {
+          throw new bindings.MojoCodecError(
+            'Trying to decode null union for non-nullable types_mojom.Error.');
+        }
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeEnum(error, 8);
+  }
+
+  String toString() {
+    return "ProcessSpawnWithTerminalResponseParams("
+           "error: $error" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["error"] = error;
+    return map;
+  }
+}
+
+
+class ProcessControllerWaitParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(8, 0)
+  ];
+
+  ProcessControllerWaitParams() : super(kVersions.last.size);
+
+  static ProcessControllerWaitParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ProcessControllerWaitParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ProcessControllerWaitParams result = new ProcessControllerWaitParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    encoder.getStructEncoderAtOffset(kVersions.last);
+  }
+
+  String toString() {
+    return "ProcessControllerWaitParams("")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    return map;
+  }
+}
+
+
+class ProcessControllerWaitResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  types_mojom.Error error = null;
+  int exitStatus = 0;
+
+  ProcessControllerWaitResponseParams() : super(kVersions.last.size);
+
+  static ProcessControllerWaitResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ProcessControllerWaitResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ProcessControllerWaitResponseParams result = new ProcessControllerWaitResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+        result.error = types_mojom.Error.decode(decoder0, 8);
+        if (result.error == null) {
+          throw new bindings.MojoCodecError(
+            'Trying to decode null union for non-nullable types_mojom.Error.');
+        }
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.exitStatus = decoder0.decodeInt32(12);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeEnum(error, 8);
+    
+    encoder0.encodeInt32(exitStatus, 12);
+  }
+
+  String toString() {
+    return "ProcessControllerWaitResponseParams("
+           "error: $error" ", "
+           "exitStatus: $exitStatus" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["error"] = error;
+    map["exitStatus"] = exitStatus;
+    return map;
+  }
+}
+
+
+class ProcessControllerKillParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  int signal = 0;
+
+  ProcessControllerKillParams() : super(kVersions.last.size);
+
+  static ProcessControllerKillParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ProcessControllerKillParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ProcessControllerKillParams result = new ProcessControllerKillParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.signal = decoder0.decodeInt32(8);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeInt32(signal, 8);
+  }
+
+  String toString() {
+    return "ProcessControllerKillParams("
+           "signal: $signal" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["signal"] = signal;
+    return map;
+  }
+}
+
+
+class ProcessControllerKillResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  types_mojom.Error error = null;
+
+  ProcessControllerKillResponseParams() : super(kVersions.last.size);
+
+  static ProcessControllerKillResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ProcessControllerKillResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ProcessControllerKillResponseParams result = new ProcessControllerKillResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+        result.error = types_mojom.Error.decode(decoder0, 8);
+        if (result.error == null) {
+          throw new bindings.MojoCodecError(
+            'Trying to decode null union for non-nullable types_mojom.Error.');
+        }
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeEnum(error, 8);
+  }
+
+  String toString() {
+    return "ProcessControllerKillResponseParams("
+           "error: $error" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["error"] = error;
+    return map;
+  }
+}
+
+const int kProcess_spawn_name = 0;
+const int kProcess_spawnWithTerminal_name = 1;
+
+const String ProcessName =
+      'native_support::Process';
+
+abstract class Process {
+  dynamic spawn(String path,List<String> argv,List<String> envp,Object stdinFile,Object stdoutFile,Object stderrFile,Object processController,[Function responseFactory = null]);
+  dynamic spawnWithTerminal(String path,List<String> argv,List<String> envp,Object terminalFile,Object processController,[Function responseFactory = null]);
+
+}
+
+
+class ProcessProxyImpl extends bindings.Proxy {
+  ProcessProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  ProcessProxyImpl.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);
+  }
+
+  String get name => ProcessName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      case kProcess_spawn_name:
+        var r = ProcessSpawnResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      case kProcess_spawnWithTerminal_name:
+        var r = ProcessSpawnWithTerminalResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "ProcessProxyImpl($superString)";
+  }
+}
+
+
+class _ProcessProxyCalls implements Process {
+  ProcessProxyImpl _proxyImpl;
+
+  _ProcessProxyCalls(this._proxyImpl);
+    dynamic spawn(String path,List<String> argv,List<String> 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,
+          kProcess_spawn_name,
+          -1,
+          bindings.MessageHeader.kMessageExpectsResponse);
+    }
+    dynamic spawnWithTerminal(String path,List<String> argv,List<String> 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,
+          kProcess_spawnWithTerminal_name,
+          -1,
+          bindings.MessageHeader.kMessageExpectsResponse);
+    }
+}
+
+
+class ProcessProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  Process ptr;
+  final String name = ProcessName;
+
+  ProcessProxy(ProcessProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _ProcessProxyCalls(proxyImpl);
+
+  ProcessProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new ProcessProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _ProcessProxyCalls(impl);
+  }
+
+  ProcessProxy.fromHandle(core.MojoHandle handle) :
+      impl = new ProcessProxyImpl.fromHandle(handle) {
+    ptr = new _ProcessProxyCalls(impl);
+  }
+
+  ProcessProxy.unbound() :
+      impl = new ProcessProxyImpl.unbound() {
+    ptr = new _ProcessProxyCalls(impl);
+  }
+
+  factory ProcessProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    ProcessProxy p = new ProcessProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static ProcessProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ProcessProxy"));
+    return new ProcessProxy.fromEndpoint(endpoint);
+  }
+
+  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)";
+  }
+}
+
+
+class ProcessStub extends bindings.Stub {
+  Process _impl = null;
+
+  ProcessStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  ProcessStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  ProcessStub.unbound() : super.unbound();
+
+  static ProcessStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ProcessStub"));
+    return new ProcessStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = ProcessName;
+
+
+  ProcessSpawnResponseParams _ProcessSpawnResponseParamsFactory(types_mojom.Error error) {
+    var result = new ProcessSpawnResponseParams();
+    result.error = error;
+    return result;
+  }
+  ProcessSpawnWithTerminalResponseParams _ProcessSpawnWithTerminalResponseParamsFactory(types_mojom.Error error) {
+    var result = new ProcessSpawnWithTerminalResponseParams();
+    result.error = error;
+    return result;
+  }
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      case kProcess_spawn_name:
+        var params = ProcessSpawnParams.deserialize(
+            message.payload);
+        var response = _impl.spawn(params.path,params.argv,params.envp,params.stdinFile,params.stdoutFile,params.stderrFile,params.processController,_ProcessSpawnResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kProcess_spawn_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kProcess_spawn_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      case kProcess_spawnWithTerminal_name:
+        var params = ProcessSpawnWithTerminalParams.deserialize(
+            message.payload);
+        var response = _impl.spawnWithTerminal(params.path,params.argv,params.envp,params.terminalFile,params.processController,_ProcessSpawnWithTerminalResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kProcess_spawnWithTerminal_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kProcess_spawnWithTerminal_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  Process get impl => _impl;
+  set impl(Process d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "ProcessStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+const int kProcessController_wait_name = 0;
+const int kProcessController_kill_name = 1;
+
+const String ProcessControllerName =
+      'native_support::ProcessController';
+
+abstract class ProcessController {
+  dynamic wait([Function responseFactory = null]);
+  dynamic kill(int signal,[Function responseFactory = null]);
+
+}
+
+
+class ProcessControllerProxyImpl extends bindings.Proxy {
+  ProcessControllerProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  ProcessControllerProxyImpl.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);
+  }
+
+  String get name => ProcessControllerName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      case kProcessController_wait_name:
+        var r = ProcessControllerWaitResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      case kProcessController_kill_name:
+        var r = ProcessControllerKillResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "ProcessControllerProxyImpl($superString)";
+  }
+}
+
+
+class _ProcessControllerProxyCalls implements ProcessController {
+  ProcessControllerProxyImpl _proxyImpl;
+
+  _ProcessControllerProxyCalls(this._proxyImpl);
+    dynamic wait([Function responseFactory = null]) {
+      var params = new ProcessControllerWaitParams();
+      return _proxyImpl.sendMessageWithRequestId(
+          params,
+          kProcessController_wait_name,
+          -1,
+          bindings.MessageHeader.kMessageExpectsResponse);
+    }
+    dynamic kill(int signal,[Function responseFactory = null]) {
+      var params = new ProcessControllerKillParams();
+      params.signal = signal;
+      return _proxyImpl.sendMessageWithRequestId(
+          params,
+          kProcessController_kill_name,
+          -1,
+          bindings.MessageHeader.kMessageExpectsResponse);
+    }
+}
+
+
+class ProcessControllerProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  ProcessController ptr;
+  final String name = ProcessControllerName;
+
+  ProcessControllerProxy(ProcessControllerProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _ProcessControllerProxyCalls(proxyImpl);
+
+  ProcessControllerProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new ProcessControllerProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _ProcessControllerProxyCalls(impl);
+  }
+
+  ProcessControllerProxy.fromHandle(core.MojoHandle handle) :
+      impl = new ProcessControllerProxyImpl.fromHandle(handle) {
+    ptr = new _ProcessControllerProxyCalls(impl);
+  }
+
+  ProcessControllerProxy.unbound() :
+      impl = new ProcessControllerProxyImpl.unbound() {
+    ptr = new _ProcessControllerProxyCalls(impl);
+  }
+
+  factory ProcessControllerProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    ProcessControllerProxy p = new ProcessControllerProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static ProcessControllerProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ProcessControllerProxy"));
+    return new ProcessControllerProxy.fromEndpoint(endpoint);
+  }
+
+  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)";
+  }
+}
+
+
+class ProcessControllerStub extends bindings.Stub {
+  ProcessController _impl = null;
+
+  ProcessControllerStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  ProcessControllerStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  ProcessControllerStub.unbound() : super.unbound();
+
+  static ProcessControllerStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ProcessControllerStub"));
+    return new ProcessControllerStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = ProcessControllerName;
+
+
+  ProcessControllerWaitResponseParams _ProcessControllerWaitResponseParamsFactory(types_mojom.Error error, int exitStatus) {
+    var result = new ProcessControllerWaitResponseParams();
+    result.error = error;
+    result.exitStatus = exitStatus;
+    return result;
+  }
+  ProcessControllerKillResponseParams _ProcessControllerKillResponseParamsFactory(types_mojom.Error error) {
+    var result = new ProcessControllerKillResponseParams();
+    result.error = error;
+    return result;
+  }
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      case kProcessController_wait_name:
+        var params = ProcessControllerWaitParams.deserialize(
+            message.payload);
+        var response = _impl.wait(_ProcessControllerWaitResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kProcessController_wait_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kProcessController_wait_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      case kProcessController_kill_name:
+        var params = ProcessControllerKillParams.deserialize(
+            message.payload);
+        var response = _impl.kill(params.signal,_ProcessControllerKillResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kProcessController_kill_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kProcessController_kill_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  ProcessController get impl => _impl;
+  set impl(ProcessController d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "ProcessControllerStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+
diff --git a/mojo/dart/packages/mojo_services/lib/nfc/nfc.mojom.dart b/mojo/dart/packages/mojo_services/lib/nfc/nfc.mojom.dart
new file mode 100644
index 0000000..bd26fa2
--- /dev/null
+++ b/mojo/dart/packages/mojo_services/lib/nfc/nfc.mojom.dart
@@ -0,0 +1,1062 @@
+// 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.
+
+library nfc_mojom;
+
+import 'dart:async';
+
+import 'package:mojo/bindings.dart' as bindings;
+import 'package:mojo/core.dart' as core;
+
+
+
+class NfcData extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  List<int> data = null;
+
+  NfcData() : super(kVersions.last.size);
+
+  static NfcData deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static NfcData decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    NfcData result = new NfcData();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.data = decoder0.decodeUint8Array(8, bindings.kArrayNullable, bindings.kUnspecifiedArrayLength);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeUint8Array(data, 8, bindings.kArrayNullable, bindings.kUnspecifiedArrayLength);
+  }
+
+  String toString() {
+    return "NfcData("
+           "data: $data" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["data"] = data;
+    return map;
+  }
+}
+
+
+class NfcTransmissionCancelParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(8, 0)
+  ];
+
+  NfcTransmissionCancelParams() : super(kVersions.last.size);
+
+  static NfcTransmissionCancelParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static NfcTransmissionCancelParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    NfcTransmissionCancelParams result = new NfcTransmissionCancelParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    encoder.getStructEncoderAtOffset(kVersions.last);
+  }
+
+  String toString() {
+    return "NfcTransmissionCancelParams("")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    return map;
+  }
+}
+
+
+class NfcReceiverOnReceivedNfcDataParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  NfcData nfcData = null;
+
+  NfcReceiverOnReceivedNfcDataParams() : super(kVersions.last.size);
+
+  static NfcReceiverOnReceivedNfcDataParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static NfcReceiverOnReceivedNfcDataParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    NfcReceiverOnReceivedNfcDataParams result = new NfcReceiverOnReceivedNfcDataParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, false);
+      result.nfcData = NfcData.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(nfcData, 8, false);
+  }
+
+  String toString() {
+    return "NfcReceiverOnReceivedNfcDataParams("
+           "nfcData: $nfcData" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["nfcData"] = nfcData;
+    return map;
+  }
+}
+
+
+class NfcTransmitOnNextConnectionParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  NfcData nfcData = null;
+  Object transmission = null;
+
+  NfcTransmitOnNextConnectionParams() : super(kVersions.last.size);
+
+  static NfcTransmitOnNextConnectionParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static NfcTransmitOnNextConnectionParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    NfcTransmitOnNextConnectionParams result = new NfcTransmitOnNextConnectionParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, false);
+      result.nfcData = NfcData.decode(decoder1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.transmission = decoder0.decodeInterfaceRequest(16, true, NfcTransmissionStub.newFromEndpoint);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(nfcData, 8, false);
+    
+    encoder0.encodeInterfaceRequest(transmission, 16, true);
+  }
+
+  String toString() {
+    return "NfcTransmitOnNextConnectionParams("
+           "nfcData: $nfcData" ", "
+           "transmission: $transmission" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+
+class NfcTransmitOnNextConnectionResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  bool success = false;
+
+  NfcTransmitOnNextConnectionResponseParams() : super(kVersions.last.size);
+
+  static NfcTransmitOnNextConnectionResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static NfcTransmitOnNextConnectionResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    NfcTransmitOnNextConnectionResponseParams result = new NfcTransmitOnNextConnectionResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.success = decoder0.decodeBool(8, 0);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeBool(success, 8, 0);
+  }
+
+  String toString() {
+    return "NfcTransmitOnNextConnectionResponseParams("
+           "success: $success" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["success"] = success;
+    return map;
+  }
+}
+
+
+class NfcRegisterParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(8, 0)
+  ];
+
+  NfcRegisterParams() : super(kVersions.last.size);
+
+  static NfcRegisterParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static NfcRegisterParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    NfcRegisterParams result = new NfcRegisterParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    encoder.getStructEncoderAtOffset(kVersions.last);
+  }
+
+  String toString() {
+    return "NfcRegisterParams("")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    return map;
+  }
+}
+
+
+class NfcUnregisterParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(8, 0)
+  ];
+
+  NfcUnregisterParams() : super(kVersions.last.size);
+
+  static NfcUnregisterParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static NfcUnregisterParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    NfcUnregisterParams result = new NfcUnregisterParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    encoder.getStructEncoderAtOffset(kVersions.last);
+  }
+
+  String toString() {
+    return "NfcUnregisterParams("")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    return map;
+  }
+}
+
+const int kNfcTransmission_cancel_name = 0;
+
+const String NfcTransmissionName =
+      'nfc::NfcTransmission';
+
+abstract class NfcTransmission {
+  void cancel();
+
+}
+
+
+class NfcTransmissionProxyImpl extends bindings.Proxy {
+  NfcTransmissionProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  NfcTransmissionProxyImpl.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);
+  }
+
+  String get name => NfcTransmissionName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "NfcTransmissionProxyImpl($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, kNfcTransmission_cancel_name);
+    }
+  
+}
+
+
+class NfcTransmissionProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  NfcTransmission ptr;
+  final String name = NfcTransmissionName;
+
+  NfcTransmissionProxy(NfcTransmissionProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _NfcTransmissionProxyCalls(proxyImpl);
+
+  NfcTransmissionProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new NfcTransmissionProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _NfcTransmissionProxyCalls(impl);
+  }
+
+  NfcTransmissionProxy.fromHandle(core.MojoHandle handle) :
+      impl = new NfcTransmissionProxyImpl.fromHandle(handle) {
+    ptr = new _NfcTransmissionProxyCalls(impl);
+  }
+
+  NfcTransmissionProxy.unbound() :
+      impl = new NfcTransmissionProxyImpl.unbound() {
+    ptr = new _NfcTransmissionProxyCalls(impl);
+  }
+
+  factory NfcTransmissionProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    NfcTransmissionProxy p = new NfcTransmissionProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static NfcTransmissionProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For NfcTransmissionProxy"));
+    return new NfcTransmissionProxy.fromEndpoint(endpoint);
+  }
+
+  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)";
+  }
+}
+
+
+class NfcTransmissionStub extends bindings.Stub {
+  NfcTransmission _impl = null;
+
+  NfcTransmissionStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  NfcTransmissionStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  NfcTransmissionStub.unbound() : super.unbound();
+
+  static NfcTransmissionStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For NfcTransmissionStub"));
+    return new NfcTransmissionStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = NfcTransmissionName;
+
+
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      case kNfcTransmission_cancel_name:
+        var params = NfcTransmissionCancelParams.deserialize(
+            message.payload);
+        _impl.cancel();
+        break;
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  NfcTransmission get impl => _impl;
+  set impl(NfcTransmission d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "NfcTransmissionStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+const int kNfcReceiver_onReceivedNfcData_name = 0;
+
+const String NfcReceiverName =
+      'nfc::NfcReceiver';
+
+abstract class NfcReceiver {
+  void onReceivedNfcData(NfcData nfcData);
+
+}
+
+
+class NfcReceiverProxyImpl extends bindings.Proxy {
+  NfcReceiverProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  NfcReceiverProxyImpl.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);
+  }
+
+  String get name => NfcReceiverName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "NfcReceiverProxyImpl($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, kNfcReceiver_onReceivedNfcData_name);
+    }
+  
+}
+
+
+class NfcReceiverProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  NfcReceiver ptr;
+  final String name = NfcReceiverName;
+
+  NfcReceiverProxy(NfcReceiverProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _NfcReceiverProxyCalls(proxyImpl);
+
+  NfcReceiverProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new NfcReceiverProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _NfcReceiverProxyCalls(impl);
+  }
+
+  NfcReceiverProxy.fromHandle(core.MojoHandle handle) :
+      impl = new NfcReceiverProxyImpl.fromHandle(handle) {
+    ptr = new _NfcReceiverProxyCalls(impl);
+  }
+
+  NfcReceiverProxy.unbound() :
+      impl = new NfcReceiverProxyImpl.unbound() {
+    ptr = new _NfcReceiverProxyCalls(impl);
+  }
+
+  factory NfcReceiverProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    NfcReceiverProxy p = new NfcReceiverProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static NfcReceiverProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For NfcReceiverProxy"));
+    return new NfcReceiverProxy.fromEndpoint(endpoint);
+  }
+
+  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)";
+  }
+}
+
+
+class NfcReceiverStub extends bindings.Stub {
+  NfcReceiver _impl = null;
+
+  NfcReceiverStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  NfcReceiverStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  NfcReceiverStub.unbound() : super.unbound();
+
+  static NfcReceiverStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For NfcReceiverStub"));
+    return new NfcReceiverStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = NfcReceiverName;
+
+
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      case kNfcReceiver_onReceivedNfcData_name:
+        var params = NfcReceiverOnReceivedNfcDataParams.deserialize(
+            message.payload);
+        _impl.onReceivedNfcData(params.nfcData);
+        break;
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  NfcReceiver get impl => _impl;
+  set impl(NfcReceiver d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "NfcReceiverStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+const int kNfc_transmitOnNextConnection_name = 0;
+const int kNfc_register_name = 1;
+const int kNfc_unregister_name = 2;
+
+const String NfcName =
+      'nfc::Nfc';
+
+abstract class Nfc {
+  dynamic transmitOnNextConnection(NfcData nfcData,Object transmission,[Function responseFactory = null]);
+  void register();
+  void unregister();
+
+}
+
+
+class NfcProxyImpl extends bindings.Proxy {
+  NfcProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  NfcProxyImpl.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);
+  }
+
+  String get name => NfcName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      case kNfc_transmitOnNextConnection_name:
+        var r = NfcTransmitOnNextConnectionResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "NfcProxyImpl($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,
+          kNfc_transmitOnNextConnection_name,
+          -1,
+          bindings.MessageHeader.kMessageExpectsResponse);
+    }
+    void register() {
+      if (!_proxyImpl.isBound) {
+        _proxyImpl.proxyError("The Proxy is closed.");
+        return;
+      }
+      var params = new NfcRegisterParams();
+      _proxyImpl.sendMessage(params, kNfc_register_name);
+    }
+  
+    void unregister() {
+      if (!_proxyImpl.isBound) {
+        _proxyImpl.proxyError("The Proxy is closed.");
+        return;
+      }
+      var params = new NfcUnregisterParams();
+      _proxyImpl.sendMessage(params, kNfc_unregister_name);
+    }
+  
+}
+
+
+class NfcProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  Nfc ptr;
+  final String name = NfcName;
+
+  NfcProxy(NfcProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _NfcProxyCalls(proxyImpl);
+
+  NfcProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new NfcProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _NfcProxyCalls(impl);
+  }
+
+  NfcProxy.fromHandle(core.MojoHandle handle) :
+      impl = new NfcProxyImpl.fromHandle(handle) {
+    ptr = new _NfcProxyCalls(impl);
+  }
+
+  NfcProxy.unbound() :
+      impl = new NfcProxyImpl.unbound() {
+    ptr = new _NfcProxyCalls(impl);
+  }
+
+  factory NfcProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    NfcProxy p = new NfcProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static NfcProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For NfcProxy"));
+    return new NfcProxy.fromEndpoint(endpoint);
+  }
+
+  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 "NfcProxy($impl)";
+  }
+}
+
+
+class NfcStub extends bindings.Stub {
+  Nfc _impl = null;
+
+  NfcStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  NfcStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  NfcStub.unbound() : super.unbound();
+
+  static NfcStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For NfcStub"));
+    return new NfcStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = NfcName;
+
+
+  NfcTransmitOnNextConnectionResponseParams _NfcTransmitOnNextConnectionResponseParamsFactory(bool success) {
+    var result = new NfcTransmitOnNextConnectionResponseParams();
+    result.success = success;
+    return result;
+  }
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      case kNfc_transmitOnNextConnection_name:
+        var params = NfcTransmitOnNextConnectionParams.deserialize(
+            message.payload);
+        var response = _impl.transmitOnNextConnection(params.nfcData,params.transmission,_NfcTransmitOnNextConnectionResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kNfc_transmitOnNextConnection_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kNfc_transmitOnNextConnection_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      case kNfc_register_name:
+        var params = NfcRegisterParams.deserialize(
+            message.payload);
+        _impl.register();
+        break;
+      case kNfc_unregister_name:
+        var params = NfcUnregisterParams.deserialize(
+            message.payload);
+        _impl.unregister();
+        break;
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  Nfc get impl => _impl;
+  set impl(Nfc d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "NfcStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+
diff --git a/mojo/dart/packages/mojo_services/lib/notifications/notifications.mojom.dart b/mojo/dart/packages/mojo_services/lib/notifications/notifications.mojom.dart
new file mode 100644
index 0000000..037ca4b
--- /dev/null
+++ b/mojo/dart/packages/mojo_services/lib/notifications/notifications.mojom.dart
@@ -0,0 +1,972 @@
+// 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.
+
+library notifications_mojom;
+
+import 'dart:async';
+
+import 'package:mojo/bindings.dart' as bindings;
+import 'package:mojo/core.dart' as core;
+
+
+
+class NotificationData extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  String title = null;
+  String text = null;
+
+  NotificationData() : super(kVersions.last.size);
+
+  static NotificationData deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static NotificationData decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    NotificationData result = new NotificationData();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.title = decoder0.decodeString(8, true);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.text = decoder0.decodeString(16, true);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeString(title, 8, true);
+    
+    encoder0.encodeString(text, 16, true);
+  }
+
+  String toString() {
+    return "NotificationData("
+           "title: $title" ", "
+           "text: $text" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["title"] = title;
+    map["text"] = text;
+    return map;
+  }
+}
+
+
+class NotificationClientOnSelectedParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(8, 0)
+  ];
+
+  NotificationClientOnSelectedParams() : super(kVersions.last.size);
+
+  static NotificationClientOnSelectedParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static NotificationClientOnSelectedParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    NotificationClientOnSelectedParams result = new NotificationClientOnSelectedParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    encoder.getStructEncoderAtOffset(kVersions.last);
+  }
+
+  String toString() {
+    return "NotificationClientOnSelectedParams("")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    return map;
+  }
+}
+
+
+class NotificationClientOnDismissedParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(8, 0)
+  ];
+
+  NotificationClientOnDismissedParams() : super(kVersions.last.size);
+
+  static NotificationClientOnDismissedParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static NotificationClientOnDismissedParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    NotificationClientOnDismissedParams result = new NotificationClientOnDismissedParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    encoder.getStructEncoderAtOffset(kVersions.last);
+  }
+
+  String toString() {
+    return "NotificationClientOnDismissedParams("")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    return map;
+  }
+}
+
+
+class NotificationUpdateParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  NotificationData notificationData = null;
+
+  NotificationUpdateParams() : super(kVersions.last.size);
+
+  static NotificationUpdateParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static NotificationUpdateParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    NotificationUpdateParams result = new NotificationUpdateParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, false);
+      result.notificationData = NotificationData.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(notificationData, 8, false);
+  }
+
+  String toString() {
+    return "NotificationUpdateParams("
+           "notificationData: $notificationData" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["notificationData"] = notificationData;
+    return map;
+  }
+}
+
+
+class NotificationCancelParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(8, 0)
+  ];
+
+  NotificationCancelParams() : super(kVersions.last.size);
+
+  static NotificationCancelParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static NotificationCancelParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    NotificationCancelParams result = new NotificationCancelParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    encoder.getStructEncoderAtOffset(kVersions.last);
+  }
+
+  String toString() {
+    return "NotificationCancelParams("")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    return map;
+  }
+}
+
+
+class NotificationServicePostParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(32, 0)
+  ];
+  NotificationData notificationData = null;
+  Object client = null;
+  Object notification = null;
+
+  NotificationServicePostParams() : super(kVersions.last.size);
+
+  static NotificationServicePostParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static NotificationServicePostParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    NotificationServicePostParams result = new NotificationServicePostParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, false);
+      result.notificationData = NotificationData.decode(decoder1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.client = decoder0.decodeServiceInterface(16, true, NotificationClientProxy.newFromEndpoint);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.notification = decoder0.decodeInterfaceRequest(24, true, NotificationStub.newFromEndpoint);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(notificationData, 8, false);
+    
+    encoder0.encodeInterface(client, 16, true);
+    
+    encoder0.encodeInterfaceRequest(notification, 24, true);
+  }
+
+  String toString() {
+    return "NotificationServicePostParams("
+           "notificationData: $notificationData" ", "
+           "client: $client" ", "
+           "notification: $notification" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+const int kNotificationClient_onSelected_name = 0;
+const int kNotificationClient_onDismissed_name = 1;
+
+const String NotificationClientName =
+      'notifications::NotificationClient';
+
+abstract class NotificationClient {
+  void onSelected();
+  void onDismissed();
+
+}
+
+
+class NotificationClientProxyImpl extends bindings.Proxy {
+  NotificationClientProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  NotificationClientProxyImpl.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);
+  }
+
+  String get name => NotificationClientName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "NotificationClientProxyImpl($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, kNotificationClient_onSelected_name);
+    }
+  
+    void onDismissed() {
+      if (!_proxyImpl.isBound) {
+        _proxyImpl.proxyError("The Proxy is closed.");
+        return;
+      }
+      var params = new NotificationClientOnDismissedParams();
+      _proxyImpl.sendMessage(params, kNotificationClient_onDismissed_name);
+    }
+  
+}
+
+
+class NotificationClientProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  NotificationClient ptr;
+  final String name = NotificationClientName;
+
+  NotificationClientProxy(NotificationClientProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _NotificationClientProxyCalls(proxyImpl);
+
+  NotificationClientProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new NotificationClientProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _NotificationClientProxyCalls(impl);
+  }
+
+  NotificationClientProxy.fromHandle(core.MojoHandle handle) :
+      impl = new NotificationClientProxyImpl.fromHandle(handle) {
+    ptr = new _NotificationClientProxyCalls(impl);
+  }
+
+  NotificationClientProxy.unbound() :
+      impl = new NotificationClientProxyImpl.unbound() {
+    ptr = new _NotificationClientProxyCalls(impl);
+  }
+
+  factory NotificationClientProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    NotificationClientProxy p = new NotificationClientProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static NotificationClientProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For NotificationClientProxy"));
+    return new NotificationClientProxy.fromEndpoint(endpoint);
+  }
+
+  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)";
+  }
+}
+
+
+class NotificationClientStub extends bindings.Stub {
+  NotificationClient _impl = null;
+
+  NotificationClientStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  NotificationClientStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  NotificationClientStub.unbound() : super.unbound();
+
+  static NotificationClientStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For NotificationClientStub"));
+    return new NotificationClientStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = NotificationClientName;
+
+
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      case kNotificationClient_onSelected_name:
+        var params = NotificationClientOnSelectedParams.deserialize(
+            message.payload);
+        _impl.onSelected();
+        break;
+      case kNotificationClient_onDismissed_name:
+        var params = NotificationClientOnDismissedParams.deserialize(
+            message.payload);
+        _impl.onDismissed();
+        break;
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  NotificationClient get impl => _impl;
+  set impl(NotificationClient d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "NotificationClientStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+const int kNotification_update_name = 0;
+const int kNotification_cancel_name = 1;
+
+const String NotificationName =
+      'notifications::Notification';
+
+abstract class Notification {
+  void update(NotificationData notificationData);
+  void cancel();
+
+}
+
+
+class NotificationProxyImpl extends bindings.Proxy {
+  NotificationProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  NotificationProxyImpl.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);
+  }
+
+  String get name => NotificationName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "NotificationProxyImpl($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, kNotification_update_name);
+    }
+  
+    void cancel() {
+      if (!_proxyImpl.isBound) {
+        _proxyImpl.proxyError("The Proxy is closed.");
+        return;
+      }
+      var params = new NotificationCancelParams();
+      _proxyImpl.sendMessage(params, kNotification_cancel_name);
+    }
+  
+}
+
+
+class NotificationProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  Notification ptr;
+  final String name = NotificationName;
+
+  NotificationProxy(NotificationProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _NotificationProxyCalls(proxyImpl);
+
+  NotificationProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new NotificationProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _NotificationProxyCalls(impl);
+  }
+
+  NotificationProxy.fromHandle(core.MojoHandle handle) :
+      impl = new NotificationProxyImpl.fromHandle(handle) {
+    ptr = new _NotificationProxyCalls(impl);
+  }
+
+  NotificationProxy.unbound() :
+      impl = new NotificationProxyImpl.unbound() {
+    ptr = new _NotificationProxyCalls(impl);
+  }
+
+  factory NotificationProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    NotificationProxy p = new NotificationProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static NotificationProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For NotificationProxy"));
+    return new NotificationProxy.fromEndpoint(endpoint);
+  }
+
+  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)";
+  }
+}
+
+
+class NotificationStub extends bindings.Stub {
+  Notification _impl = null;
+
+  NotificationStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  NotificationStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  NotificationStub.unbound() : super.unbound();
+
+  static NotificationStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For NotificationStub"));
+    return new NotificationStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = NotificationName;
+
+
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      case kNotification_update_name:
+        var params = NotificationUpdateParams.deserialize(
+            message.payload);
+        _impl.update(params.notificationData);
+        break;
+      case kNotification_cancel_name:
+        var params = NotificationCancelParams.deserialize(
+            message.payload);
+        _impl.cancel();
+        break;
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  Notification get impl => _impl;
+  set impl(Notification d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "NotificationStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+const int kNotificationService_post_name = 0;
+
+const String NotificationServiceName =
+      'notifications::NotificationService';
+
+abstract class NotificationService {
+  void post(NotificationData notificationData, Object client, Object notification);
+
+}
+
+
+class NotificationServiceProxyImpl extends bindings.Proxy {
+  NotificationServiceProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  NotificationServiceProxyImpl.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);
+  }
+
+  String get name => NotificationServiceName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "NotificationServiceProxyImpl($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, kNotificationService_post_name);
+    }
+  
+}
+
+
+class NotificationServiceProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  NotificationService ptr;
+  final String name = NotificationServiceName;
+
+  NotificationServiceProxy(NotificationServiceProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _NotificationServiceProxyCalls(proxyImpl);
+
+  NotificationServiceProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new NotificationServiceProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _NotificationServiceProxyCalls(impl);
+  }
+
+  NotificationServiceProxy.fromHandle(core.MojoHandle handle) :
+      impl = new NotificationServiceProxyImpl.fromHandle(handle) {
+    ptr = new _NotificationServiceProxyCalls(impl);
+  }
+
+  NotificationServiceProxy.unbound() :
+      impl = new NotificationServiceProxyImpl.unbound() {
+    ptr = new _NotificationServiceProxyCalls(impl);
+  }
+
+  factory NotificationServiceProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    NotificationServiceProxy p = new NotificationServiceProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static NotificationServiceProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For NotificationServiceProxy"));
+    return new NotificationServiceProxy.fromEndpoint(endpoint);
+  }
+
+  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)";
+  }
+}
+
+
+class NotificationServiceStub extends bindings.Stub {
+  NotificationService _impl = null;
+
+  NotificationServiceStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  NotificationServiceStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  NotificationServiceStub.unbound() : super.unbound();
+
+  static NotificationServiceStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For NotificationServiceStub"));
+    return new NotificationServiceStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = NotificationServiceName;
+
+
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      case kNotificationService_post_name:
+        var params = NotificationServicePostParams.deserialize(
+            message.payload);
+        _impl.post(params.notificationData, params.client, params.notification);
+        break;
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  NotificationService get impl => _impl;
+  set impl(NotificationService d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "NotificationServiceStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+
diff --git a/mojo/dart/packages/mojo_services/lib/prediction/prediction.mojom.dart b/mojo/dart/packages/mojo_services/lib/prediction/prediction.mojom.dart
new file mode 100644
index 0000000..200d6ec
--- /dev/null
+++ b/mojo/dart/packages/mojo_services/lib/prediction/prediction.mojom.dart
@@ -0,0 +1,551 @@
+// 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.
+
+library prediction_mojom;
+
+import 'dart:async';
+
+import 'package:mojo/bindings.dart' as bindings;
+import 'package:mojo/core.dart' as core;
+
+
+
+class PrevWordInfo extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  String word = null;
+  bool isBeginningOfSentence = false;
+
+  PrevWordInfo() : super(kVersions.last.size);
+
+  static PrevWordInfo deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static PrevWordInfo decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    PrevWordInfo result = new PrevWordInfo();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.word = decoder0.decodeString(8, false);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.isBeginningOfSentence = decoder0.decodeBool(16, 0);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeString(word, 8, false);
+    
+    encoder0.encodeBool(isBeginningOfSentence, 16, 0);
+  }
+
+  String toString() {
+    return "PrevWordInfo("
+           "word: $word" ", "
+           "isBeginningOfSentence: $isBeginningOfSentence" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["word"] = word;
+    map["isBeginningOfSentence"] = isBeginningOfSentence;
+    return map;
+  }
+}
+
+
+class PredictionInfo extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  List<PrevWordInfo> previousWords = null;
+  String currentWord = null;
+
+  PredictionInfo() : super(kVersions.last.size);
+
+  static PredictionInfo deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static PredictionInfo decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    PredictionInfo result = new PredictionInfo();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, false);
+      {
+        var si1 = decoder1.decodeDataHeaderForPointerArray(bindings.kUnspecifiedArrayLength);
+        result.previousWords = new List<PrevWordInfo>(si1.numElements);
+        for (int i1 = 0; i1 < si1.numElements; ++i1) {
+          
+          var decoder2 = decoder1.decodePointer(bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i1, false);
+          result.previousWords[i1] = PrevWordInfo.decode(decoder2);
+        }
+      }
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.currentWord = decoder0.decodeString(16, false);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    if (previousWords == null) {
+      encoder0.encodeNullPointer(8, false);
+    } else {
+      var encoder1 = encoder0.encodePointerArray(previousWords.length, 8, bindings.kUnspecifiedArrayLength);
+      for (int i0 = 0; i0 < previousWords.length; ++i0) {
+        
+        encoder1.encodeStruct(previousWords[i0], bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i0, false);
+      }
+    }
+    
+    encoder0.encodeString(currentWord, 16, false);
+  }
+
+  String toString() {
+    return "PredictionInfo("
+           "previousWords: $previousWords" ", "
+           "currentWord: $currentWord" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["previousWords"] = previousWords;
+    map["currentWord"] = currentWord;
+    return map;
+  }
+}
+
+
+class PredictionServiceGetPredictionListParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  PredictionInfo predictionInfo = null;
+
+  PredictionServiceGetPredictionListParams() : super(kVersions.last.size);
+
+  static PredictionServiceGetPredictionListParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static PredictionServiceGetPredictionListParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    PredictionServiceGetPredictionListParams result = new PredictionServiceGetPredictionListParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, false);
+      result.predictionInfo = PredictionInfo.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(predictionInfo, 8, false);
+  }
+
+  String toString() {
+    return "PredictionServiceGetPredictionListParams("
+           "predictionInfo: $predictionInfo" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["predictionInfo"] = predictionInfo;
+    return map;
+  }
+}
+
+
+class PredictionServiceGetPredictionListResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  List<String> predictionList = null;
+
+  PredictionServiceGetPredictionListResponseParams() : super(kVersions.last.size);
+
+  static PredictionServiceGetPredictionListResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static PredictionServiceGetPredictionListResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    PredictionServiceGetPredictionListResponseParams result = new PredictionServiceGetPredictionListResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, true);
+      if (decoder1 == null) {
+        result.predictionList = null;
+      } else {
+        var si1 = decoder1.decodeDataHeaderForPointerArray(bindings.kUnspecifiedArrayLength);
+        result.predictionList = new List<String>(si1.numElements);
+        for (int i1 = 0; i1 < si1.numElements; ++i1) {
+          
+          result.predictionList[i1] = decoder1.decodeString(bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i1, false);
+        }
+      }
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    if (predictionList == null) {
+      encoder0.encodeNullPointer(8, true);
+    } else {
+      var encoder1 = encoder0.encodePointerArray(predictionList.length, 8, bindings.kUnspecifiedArrayLength);
+      for (int i0 = 0; i0 < predictionList.length; ++i0) {
+        
+        encoder1.encodeString(predictionList[i0], bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i0, false);
+      }
+    }
+  }
+
+  String toString() {
+    return "PredictionServiceGetPredictionListResponseParams("
+           "predictionList: $predictionList" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["predictionList"] = predictionList;
+    return map;
+  }
+}
+
+const int kPredictionService_getPredictionList_name = 0;
+
+const String PredictionServiceName =
+      'prediction::PredictionService';
+
+abstract class PredictionService {
+  dynamic getPredictionList(PredictionInfo predictionInfo,[Function responseFactory = null]);
+
+}
+
+
+class PredictionServiceProxyImpl extends bindings.Proxy {
+  PredictionServiceProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  PredictionServiceProxyImpl.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);
+  }
+
+  String get name => PredictionServiceName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      case kPredictionService_getPredictionList_name:
+        var r = PredictionServiceGetPredictionListResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "PredictionServiceProxyImpl($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,
+          kPredictionService_getPredictionList_name,
+          -1,
+          bindings.MessageHeader.kMessageExpectsResponse);
+    }
+}
+
+
+class PredictionServiceProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  PredictionService ptr;
+  final String name = PredictionServiceName;
+
+  PredictionServiceProxy(PredictionServiceProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _PredictionServiceProxyCalls(proxyImpl);
+
+  PredictionServiceProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new PredictionServiceProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _PredictionServiceProxyCalls(impl);
+  }
+
+  PredictionServiceProxy.fromHandle(core.MojoHandle handle) :
+      impl = new PredictionServiceProxyImpl.fromHandle(handle) {
+    ptr = new _PredictionServiceProxyCalls(impl);
+  }
+
+  PredictionServiceProxy.unbound() :
+      impl = new PredictionServiceProxyImpl.unbound() {
+    ptr = new _PredictionServiceProxyCalls(impl);
+  }
+
+  factory PredictionServiceProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    PredictionServiceProxy p = new PredictionServiceProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static PredictionServiceProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For PredictionServiceProxy"));
+    return new PredictionServiceProxy.fromEndpoint(endpoint);
+  }
+
+  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)";
+  }
+}
+
+
+class PredictionServiceStub extends bindings.Stub {
+  PredictionService _impl = null;
+
+  PredictionServiceStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  PredictionServiceStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  PredictionServiceStub.unbound() : super.unbound();
+
+  static PredictionServiceStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For PredictionServiceStub"));
+    return new PredictionServiceStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = PredictionServiceName;
+
+
+  PredictionServiceGetPredictionListResponseParams _PredictionServiceGetPredictionListResponseParamsFactory(List<String> predictionList) {
+    var result = new PredictionServiceGetPredictionListResponseParams();
+    result.predictionList = predictionList;
+    return result;
+  }
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      case kPredictionService_getPredictionList_name:
+        var params = PredictionServiceGetPredictionListParams.deserialize(
+            message.payload);
+        var response = _impl.getPredictionList(params.predictionInfo,_PredictionServiceGetPredictionListResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kPredictionService_getPredictionList_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kPredictionService_getPredictionList_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  PredictionService get impl => _impl;
+  set impl(PredictionService d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "PredictionServiceStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+
diff --git a/mojo/dart/packages/mojo_services/lib/sensors/sensors.mojom.dart b/mojo/dart/packages/mojo_services/lib/sensors/sensors.mojom.dart
new file mode 100644
index 0000000..c461545
--- /dev/null
+++ b/mojo/dart/packages/mojo_services/lib/sensors/sensors.mojom.dart
@@ -0,0 +1,847 @@
+// 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.
+
+library sensors_mojom;
+
+import 'dart:async';
+
+import 'package:mojo/bindings.dart' as bindings;
+import 'package:mojo/core.dart' as core;
+class SensorType extends bindings.MojoEnum {
+  static const ACCELEROMETER = const SensorType._(0);
+  static const AMBIENT_TEMPERATURE = const SensorType._(1);
+  static const GAME_ROTATION_VECTOR = const SensorType._(2);
+  static const GEOMAGNETIC_ROTATION_VECTOR = const SensorType._(3);
+  static const GRAVITY = const SensorType._(4);
+  static const GYROSCOPE = const SensorType._(5);
+  static const GYROSCOPE_UNCALIBRATED = const SensorType._(6);
+  static const HEART_RATE = const SensorType._(7);
+  static const LIGHT = const SensorType._(8);
+  static const LINEAR_ACCELERATION = const SensorType._(9);
+  static const MAGNETIC_FIELD = const SensorType._(10);
+  static const MAGNETIC_FIELD_UNCALIBRATED = const SensorType._(11);
+  static const PRESSURE = const SensorType._(12);
+  static const PROXIMITY = const SensorType._(13);
+  static const RELATIVE_HUMIDITY = const SensorType._(14);
+  static const ROTATION_VECTOR = const SensorType._(15);
+  static const SIGNIFICANT_MOTION = const SensorType._(16);
+  static const STEP_COUNTER = const SensorType._(17);
+  static const STEP_DETECTOR = const SensorType._(18);
+
+  const SensorType._(int v) : super(v);
+
+  static const Map<String, SensorType> valuesMap = const {
+    "ACCELEROMETER": ACCELEROMETER,
+    "AMBIENT_TEMPERATURE": AMBIENT_TEMPERATURE,
+    "GAME_ROTATION_VECTOR": GAME_ROTATION_VECTOR,
+    "GEOMAGNETIC_ROTATION_VECTOR": GEOMAGNETIC_ROTATION_VECTOR,
+    "GRAVITY": GRAVITY,
+    "GYROSCOPE": GYROSCOPE,
+    "GYROSCOPE_UNCALIBRATED": GYROSCOPE_UNCALIBRATED,
+    "HEART_RATE": HEART_RATE,
+    "LIGHT": LIGHT,
+    "LINEAR_ACCELERATION": LINEAR_ACCELERATION,
+    "MAGNETIC_FIELD": MAGNETIC_FIELD,
+    "MAGNETIC_FIELD_UNCALIBRATED": MAGNETIC_FIELD_UNCALIBRATED,
+    "PRESSURE": PRESSURE,
+    "PROXIMITY": PROXIMITY,
+    "RELATIVE_HUMIDITY": RELATIVE_HUMIDITY,
+    "ROTATION_VECTOR": ROTATION_VECTOR,
+    "SIGNIFICANT_MOTION": SIGNIFICANT_MOTION,
+    "STEP_COUNTER": STEP_COUNTER,
+    "STEP_DETECTOR": STEP_DETECTOR,
+  };
+  static const List<SensorType> values = const [
+    ACCELEROMETER,
+    AMBIENT_TEMPERATURE,
+    GAME_ROTATION_VECTOR,
+    GEOMAGNETIC_ROTATION_VECTOR,
+    GRAVITY,
+    GYROSCOPE,
+    GYROSCOPE_UNCALIBRATED,
+    HEART_RATE,
+    LIGHT,
+    LINEAR_ACCELERATION,
+    MAGNETIC_FIELD,
+    MAGNETIC_FIELD_UNCALIBRATED,
+    PRESSURE,
+    PROXIMITY,
+    RELATIVE_HUMIDITY,
+    ROTATION_VECTOR,
+    SIGNIFICANT_MOTION,
+    STEP_COUNTER,
+    STEP_DETECTOR,
+  ];
+
+  static SensorType valueOf(String name) => valuesMap[name];
+
+  factory SensorType(int v) {
+    switch (v) {
+      case 0:
+        return ACCELEROMETER;
+      case 1:
+        return AMBIENT_TEMPERATURE;
+      case 2:
+        return GAME_ROTATION_VECTOR;
+      case 3:
+        return GEOMAGNETIC_ROTATION_VECTOR;
+      case 4:
+        return GRAVITY;
+      case 5:
+        return GYROSCOPE;
+      case 6:
+        return GYROSCOPE_UNCALIBRATED;
+      case 7:
+        return HEART_RATE;
+      case 8:
+        return LIGHT;
+      case 9:
+        return LINEAR_ACCELERATION;
+      case 10:
+        return MAGNETIC_FIELD;
+      case 11:
+        return MAGNETIC_FIELD_UNCALIBRATED;
+      case 12:
+        return PRESSURE;
+      case 13:
+        return PROXIMITY;
+      case 14:
+        return RELATIVE_HUMIDITY;
+      case 15:
+        return ROTATION_VECTOR;
+      case 16:
+        return SIGNIFICANT_MOTION;
+      case 17:
+        return STEP_COUNTER;
+      case 18:
+        return STEP_DETECTOR;
+      default:
+        return null;
+    }
+  }
+
+  static SensorType decode(bindings.Decoder decoder0, int offset) {
+    int v = decoder0.decodeUint32(offset);
+    SensorType result = new SensorType(v);
+    if (result == null) {
+      throw new bindings.MojoCodecError(
+          'Bad value $v for enum SensorType.');
+    }
+    return result;
+  }
+
+  String toString() {
+    switch(this) {
+      case ACCELEROMETER:
+        return 'SensorType.ACCELEROMETER';
+      case AMBIENT_TEMPERATURE:
+        return 'SensorType.AMBIENT_TEMPERATURE';
+      case GAME_ROTATION_VECTOR:
+        return 'SensorType.GAME_ROTATION_VECTOR';
+      case GEOMAGNETIC_ROTATION_VECTOR:
+        return 'SensorType.GEOMAGNETIC_ROTATION_VECTOR';
+      case GRAVITY:
+        return 'SensorType.GRAVITY';
+      case GYROSCOPE:
+        return 'SensorType.GYROSCOPE';
+      case GYROSCOPE_UNCALIBRATED:
+        return 'SensorType.GYROSCOPE_UNCALIBRATED';
+      case HEART_RATE:
+        return 'SensorType.HEART_RATE';
+      case LIGHT:
+        return 'SensorType.LIGHT';
+      case LINEAR_ACCELERATION:
+        return 'SensorType.LINEAR_ACCELERATION';
+      case MAGNETIC_FIELD:
+        return 'SensorType.MAGNETIC_FIELD';
+      case MAGNETIC_FIELD_UNCALIBRATED:
+        return 'SensorType.MAGNETIC_FIELD_UNCALIBRATED';
+      case PRESSURE:
+        return 'SensorType.PRESSURE';
+      case PROXIMITY:
+        return 'SensorType.PROXIMITY';
+      case RELATIVE_HUMIDITY:
+        return 'SensorType.RELATIVE_HUMIDITY';
+      case ROTATION_VECTOR:
+        return 'SensorType.ROTATION_VECTOR';
+      case SIGNIFICANT_MOTION:
+        return 'SensorType.SIGNIFICANT_MOTION';
+      case STEP_COUNTER:
+        return 'SensorType.STEP_COUNTER';
+      case STEP_DETECTOR:
+        return 'SensorType.STEP_DETECTOR';
+    }
+  }
+
+  int toJson() => value;
+}
+
+
+
+class SensorData extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(32, 0)
+  ];
+  int accuracy = 0;
+  int timeStamp = 0;
+  List<double> values = null;
+
+  SensorData() : super(kVersions.last.size);
+
+  static SensorData deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static SensorData decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    SensorData result = new SensorData();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.accuracy = decoder0.decodeInt32(8);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.timeStamp = decoder0.decodeInt64(16);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.values = decoder0.decodeFloatArray(24, bindings.kNothingNullable, bindings.kUnspecifiedArrayLength);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeInt32(accuracy, 8);
+    
+    encoder0.encodeInt64(timeStamp, 16);
+    
+    encoder0.encodeFloatArray(values, 24, bindings.kNothingNullable, bindings.kUnspecifiedArrayLength);
+  }
+
+  String toString() {
+    return "SensorData("
+           "accuracy: $accuracy" ", "
+           "timeStamp: $timeStamp" ", "
+           "values: $values" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["accuracy"] = accuracy;
+    map["timeStamp"] = timeStamp;
+    map["values"] = values;
+    return map;
+  }
+}
+
+
+class SensorListenerOnAccuracyChangedParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  int accuracy = 0;
+
+  SensorListenerOnAccuracyChangedParams() : super(kVersions.last.size);
+
+  static SensorListenerOnAccuracyChangedParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static SensorListenerOnAccuracyChangedParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    SensorListenerOnAccuracyChangedParams result = new SensorListenerOnAccuracyChangedParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.accuracy = decoder0.decodeInt32(8);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeInt32(accuracy, 8);
+  }
+
+  String toString() {
+    return "SensorListenerOnAccuracyChangedParams("
+           "accuracy: $accuracy" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["accuracy"] = accuracy;
+    return map;
+  }
+}
+
+
+class SensorListenerOnSensorChangedParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  SensorData data = null;
+
+  SensorListenerOnSensorChangedParams() : super(kVersions.last.size);
+
+  static SensorListenerOnSensorChangedParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static SensorListenerOnSensorChangedParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    SensorListenerOnSensorChangedParams result = new SensorListenerOnSensorChangedParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, false);
+      result.data = SensorData.decode(decoder1);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(data, 8, false);
+  }
+
+  String toString() {
+    return "SensorListenerOnSensorChangedParams("
+           "data: $data" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["data"] = data;
+    return map;
+  }
+}
+
+
+class SensorServiceAddListenerParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  SensorType type = null;
+  Object listener = null;
+
+  SensorServiceAddListenerParams() : super(kVersions.last.size);
+
+  static SensorServiceAddListenerParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static SensorServiceAddListenerParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    SensorServiceAddListenerParams result = new SensorServiceAddListenerParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+        result.type = SensorType.decode(decoder0, 8);
+        if (result.type == null) {
+          throw new bindings.MojoCodecError(
+            'Trying to decode null union for non-nullable SensorType.');
+        }
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.listener = decoder0.decodeServiceInterface(12, false, SensorListenerProxy.newFromEndpoint);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeEnum(type, 8);
+    
+    encoder0.encodeInterface(listener, 12, false);
+  }
+
+  String toString() {
+    return "SensorServiceAddListenerParams("
+           "type: $type" ", "
+           "listener: $listener" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+const int kSensorListener_onAccuracyChanged_name = 0;
+const int kSensorListener_onSensorChanged_name = 1;
+
+const String SensorListenerName =
+      'sensors::SensorListener';
+
+abstract class SensorListener {
+  void onAccuracyChanged(int accuracy);
+  void onSensorChanged(SensorData data);
+
+}
+
+
+class SensorListenerProxyImpl extends bindings.Proxy {
+  SensorListenerProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  SensorListenerProxyImpl.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);
+  }
+
+  String get name => SensorListenerName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "SensorListenerProxyImpl($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, kSensorListener_onAccuracyChanged_name);
+    }
+  
+    void onSensorChanged(SensorData data) {
+      if (!_proxyImpl.isBound) {
+        _proxyImpl.proxyError("The Proxy is closed.");
+        return;
+      }
+      var params = new SensorListenerOnSensorChangedParams();
+      params.data = data;
+      _proxyImpl.sendMessage(params, kSensorListener_onSensorChanged_name);
+    }
+  
+}
+
+
+class SensorListenerProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  SensorListener ptr;
+  final String name = SensorListenerName;
+
+  SensorListenerProxy(SensorListenerProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _SensorListenerProxyCalls(proxyImpl);
+
+  SensorListenerProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new SensorListenerProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _SensorListenerProxyCalls(impl);
+  }
+
+  SensorListenerProxy.fromHandle(core.MojoHandle handle) :
+      impl = new SensorListenerProxyImpl.fromHandle(handle) {
+    ptr = new _SensorListenerProxyCalls(impl);
+  }
+
+  SensorListenerProxy.unbound() :
+      impl = new SensorListenerProxyImpl.unbound() {
+    ptr = new _SensorListenerProxyCalls(impl);
+  }
+
+  factory SensorListenerProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    SensorListenerProxy p = new SensorListenerProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static SensorListenerProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For SensorListenerProxy"));
+    return new SensorListenerProxy.fromEndpoint(endpoint);
+  }
+
+  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)";
+  }
+}
+
+
+class SensorListenerStub extends bindings.Stub {
+  SensorListener _impl = null;
+
+  SensorListenerStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  SensorListenerStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  SensorListenerStub.unbound() : super.unbound();
+
+  static SensorListenerStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For SensorListenerStub"));
+    return new SensorListenerStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = SensorListenerName;
+
+
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      case kSensorListener_onAccuracyChanged_name:
+        var params = SensorListenerOnAccuracyChangedParams.deserialize(
+            message.payload);
+        _impl.onAccuracyChanged(params.accuracy);
+        break;
+      case kSensorListener_onSensorChanged_name:
+        var params = SensorListenerOnSensorChangedParams.deserialize(
+            message.payload);
+        _impl.onSensorChanged(params.data);
+        break;
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  SensorListener get impl => _impl;
+  set impl(SensorListener d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "SensorListenerStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+const int kSensorService_addListener_name = 0;
+
+const String SensorServiceName =
+      'sensors::SensorService';
+
+abstract class SensorService {
+  void addListener(SensorType type, Object listener);
+
+}
+
+
+class SensorServiceProxyImpl extends bindings.Proxy {
+  SensorServiceProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  SensorServiceProxyImpl.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);
+  }
+
+  String get name => SensorServiceName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "SensorServiceProxyImpl($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, kSensorService_addListener_name);
+    }
+  
+}
+
+
+class SensorServiceProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  SensorService ptr;
+  final String name = SensorServiceName;
+
+  SensorServiceProxy(SensorServiceProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _SensorServiceProxyCalls(proxyImpl);
+
+  SensorServiceProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new SensorServiceProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _SensorServiceProxyCalls(impl);
+  }
+
+  SensorServiceProxy.fromHandle(core.MojoHandle handle) :
+      impl = new SensorServiceProxyImpl.fromHandle(handle) {
+    ptr = new _SensorServiceProxyCalls(impl);
+  }
+
+  SensorServiceProxy.unbound() :
+      impl = new SensorServiceProxyImpl.unbound() {
+    ptr = new _SensorServiceProxyCalls(impl);
+  }
+
+  factory SensorServiceProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    SensorServiceProxy p = new SensorServiceProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static SensorServiceProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For SensorServiceProxy"));
+    return new SensorServiceProxy.fromEndpoint(endpoint);
+  }
+
+  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)";
+  }
+}
+
+
+class SensorServiceStub extends bindings.Stub {
+  SensorService _impl = null;
+
+  SensorServiceStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  SensorServiceStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  SensorServiceStub.unbound() : super.unbound();
+
+  static SensorServiceStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For SensorServiceStub"));
+    return new SensorServiceStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = SensorServiceName;
+
+
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      case kSensorService_addListener_name:
+        var params = SensorServiceAddListenerParams.deserialize(
+            message.payload);
+        _impl.addListener(params.type, params.listener);
+        break;
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  SensorService get impl => _impl;
+  set impl(SensorService d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "SensorServiceStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+
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
new file mode 100644
index 0000000..401a5cd
--- /dev/null
+++ b/mojo/dart/packages/mojo_services/lib/speech_recognizer/speech_recognizer.mojom.dart
@@ -0,0 +1,727 @@
+// 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.
+
+library speech_recognizer_mojom;
+
+import 'dart:async';
+
+import 'package:mojo/bindings.dart' as bindings;
+import 'package:mojo/core.dart' as core;
+class Error extends bindings.MojoEnum {
+  static const NETWORK_TIMEOUT = const Error._(1);
+  static const NETWORK = const Error._(2);
+  static const AUDIO = const Error._(3);
+  static const SERVER = const Error._(4);
+  static const CLIENT = const Error._(5);
+  static const SPEECH_TIMEOUT = const Error._(6);
+  static const NO_MATCH = const Error._(7);
+  static const RECOGNIZER_BUSY = const Error._(8);
+  static const INSUFFICIENT_PERMISSIONS = const Error._(9);
+
+  const Error._(int v) : super(v);
+
+  static const Map<String, Error> valuesMap = const {
+    "NETWORK_TIMEOUT": NETWORK_TIMEOUT,
+    "NETWORK": NETWORK,
+    "AUDIO": AUDIO,
+    "SERVER": SERVER,
+    "CLIENT": CLIENT,
+    "SPEECH_TIMEOUT": SPEECH_TIMEOUT,
+    "NO_MATCH": NO_MATCH,
+    "RECOGNIZER_BUSY": RECOGNIZER_BUSY,
+    "INSUFFICIENT_PERMISSIONS": INSUFFICIENT_PERMISSIONS,
+  };
+  static const List<Error> values = const [
+    NETWORK_TIMEOUT,
+    NETWORK,
+    AUDIO,
+    SERVER,
+    CLIENT,
+    SPEECH_TIMEOUT,
+    NO_MATCH,
+    RECOGNIZER_BUSY,
+    INSUFFICIENT_PERMISSIONS,
+  ];
+
+  static Error valueOf(String name) => valuesMap[name];
+
+  factory Error(int v) {
+    switch (v) {
+      case 1:
+        return NETWORK_TIMEOUT;
+      case 2:
+        return NETWORK;
+      case 3:
+        return AUDIO;
+      case 4:
+        return SERVER;
+      case 5:
+        return CLIENT;
+      case 6:
+        return SPEECH_TIMEOUT;
+      case 7:
+        return NO_MATCH;
+      case 8:
+        return RECOGNIZER_BUSY;
+      case 9:
+        return INSUFFICIENT_PERMISSIONS;
+      default:
+        return null;
+    }
+  }
+
+  static Error decode(bindings.Decoder decoder0, int offset) {
+    int v = decoder0.decodeUint32(offset);
+    Error result = new Error(v);
+    if (result == null) {
+      throw new bindings.MojoCodecError(
+          'Bad value $v for enum Error.');
+    }
+    return result;
+  }
+
+  String toString() {
+    switch(this) {
+      case NETWORK_TIMEOUT:
+        return 'Error.NETWORK_TIMEOUT';
+      case NETWORK:
+        return 'Error.NETWORK';
+      case AUDIO:
+        return 'Error.AUDIO';
+      case SERVER:
+        return 'Error.SERVER';
+      case CLIENT:
+        return 'Error.CLIENT';
+      case SPEECH_TIMEOUT:
+        return 'Error.SPEECH_TIMEOUT';
+      case NO_MATCH:
+        return 'Error.NO_MATCH';
+      case RECOGNIZER_BUSY:
+        return 'Error.RECOGNIZER_BUSY';
+      case INSUFFICIENT_PERMISSIONS:
+        return 'Error.INSUFFICIENT_PERMISSIONS';
+    }
+  }
+
+  int toJson() => value;
+}
+
+
+
+class UtteranceCandidate extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  String text = null;
+  double confidenceScore = 0.0;
+
+  UtteranceCandidate() : super(kVersions.last.size);
+
+  static UtteranceCandidate deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static UtteranceCandidate decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    UtteranceCandidate result = new UtteranceCandidate();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.text = decoder0.decodeString(8, false);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.confidenceScore = decoder0.decodeFloat(16);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeString(text, 8, false);
+    
+    encoder0.encodeFloat(confidenceScore, 16);
+  }
+
+  String toString() {
+    return "UtteranceCandidate("
+           "text: $text" ", "
+           "confidenceScore: $confidenceScore" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["text"] = text;
+    map["confidenceScore"] = confidenceScore;
+    return map;
+  }
+}
+
+
+class SpeechRecognizerServiceListenParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(8, 0)
+  ];
+
+  SpeechRecognizerServiceListenParams() : super(kVersions.last.size);
+
+  static SpeechRecognizerServiceListenParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static SpeechRecognizerServiceListenParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    SpeechRecognizerServiceListenParams result = new SpeechRecognizerServiceListenParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    encoder.getStructEncoderAtOffset(kVersions.last);
+  }
+
+  String toString() {
+    return "SpeechRecognizerServiceListenParams("")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    return map;
+  }
+}
+
+
+class SpeechRecognizerServiceListenResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  ResultOrError resultOrError = null;
+
+  SpeechRecognizerServiceListenResponseParams() : super(kVersions.last.size);
+
+  static SpeechRecognizerServiceListenResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static SpeechRecognizerServiceListenResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    SpeechRecognizerServiceListenResponseParams result = new SpeechRecognizerServiceListenResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+        result.resultOrError = ResultOrError.decode(decoder0, 8);
+        if (result.resultOrError == null) {
+          throw new bindings.MojoCodecError(
+            'Trying to decode null union for non-nullable ResultOrError.');
+        }
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeUnion(resultOrError, 8, false);
+  }
+
+  String toString() {
+    return "SpeechRecognizerServiceListenResponseParams("
+           "resultOrError: $resultOrError" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["resultOrError"] = resultOrError;
+    return map;
+  }
+}
+
+
+class SpeechRecognizerServiceStopListeningParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(8, 0)
+  ];
+
+  SpeechRecognizerServiceStopListeningParams() : super(kVersions.last.size);
+
+  static SpeechRecognizerServiceStopListeningParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static SpeechRecognizerServiceStopListeningParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    SpeechRecognizerServiceStopListeningParams result = new SpeechRecognizerServiceStopListeningParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    encoder.getStructEncoderAtOffset(kVersions.last);
+  }
+
+  String toString() {
+    return "SpeechRecognizerServiceStopListeningParams("")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    return map;
+  }
+}
+
+
+
+enum ResultOrErrorTag {
+  errorCode,
+  results,
+  unknown
+}
+
+class ResultOrError extends bindings.Union {
+  static final _tag_to_int = const {
+    ResultOrErrorTag.errorCode: 0,
+    ResultOrErrorTag.results: 1,
+  };
+
+  static final _int_to_tag = const {
+    0: ResultOrErrorTag.errorCode,
+    1: ResultOrErrorTag.results,
+  };
+
+  var _data;
+  ResultOrErrorTag _tag = ResultOrErrorTag.unknown;
+
+  ResultOrErrorTag get tag => _tag;
+  Error get errorCode {
+    if (_tag != ResultOrErrorTag.errorCode) {
+      throw new bindings.UnsetUnionTagError(_tag, ResultOrErrorTag.errorCode);
+    }
+    return _data;
+  }
+
+  set errorCode(Error value) {
+    _tag = ResultOrErrorTag.errorCode;
+    _data = value;
+  }
+  List<UtteranceCandidate> get results {
+    if (_tag != ResultOrErrorTag.results) {
+      throw new bindings.UnsetUnionTagError(_tag, ResultOrErrorTag.results);
+    }
+    return _data;
+  }
+
+  set results(List<UtteranceCandidate> value) {
+    _tag = ResultOrErrorTag.results;
+    _data = value;
+  }
+
+  static ResultOrError decode(bindings.Decoder decoder0, int offset) {
+    int size = decoder0.decodeUint32(offset);
+    if (size == 0) {
+      return null;
+    }
+    ResultOrError result = new ResultOrError();
+
+    // TODO(azani): Handle unknown union member.
+    ResultOrErrorTag tag = _int_to_tag[decoder0.decodeUint32(offset + 4)];
+    switch (tag) {
+      case ResultOrErrorTag.errorCode:
+        
+          result.errorCode = Error.decode(decoder0, offset + 8);
+          if (result.errorCode == null) {
+            throw new bindings.MojoCodecError(
+              'Trying to decode null union for non-nullable Error.');
+          }
+        break;
+      case ResultOrErrorTag.results:
+        
+        var decoder1 = decoder0.decodePointer(offset + 8, false);
+        {
+          var si1 = decoder1.decodeDataHeaderForPointerArray(bindings.kUnspecifiedArrayLength);
+          result.results = new List<UtteranceCandidate>(si1.numElements);
+          for (int i1 = 0; i1 < si1.numElements; ++i1) {
+            
+            var decoder2 = decoder1.decodePointer(bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i1, false);
+            result.results[i1] = UtteranceCandidate.decode(decoder2);
+          }
+        }
+        break;
+    }
+
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder0, int offset) {
+    // TODO(azani): Error when trying to encode an unknown member.
+    encoder0.encodeUint32(16, offset);
+    encoder0.encodeUint32(_tag_to_int[_tag], offset + 4);
+    switch (_tag) {
+      case ResultOrErrorTag.errorCode:
+        
+        encoder0.encodeEnum(errorCode, offset + 8);
+        break;
+      case ResultOrErrorTag.results:
+        
+        if (results == null) {
+          encoder0.encodeNullPointer(offset + 8, false);
+        } else {
+          var encoder1 = encoder0.encodePointerArray(results.length, offset + 8, bindings.kUnspecifiedArrayLength);
+          for (int i0 = 0; i0 < results.length; ++i0) {
+            
+            encoder1.encodeStruct(results[i0], bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i0, false);
+          }
+        }
+        break;
+    }
+  }
+
+  String toString() {
+    String result = "ResultOrError(";
+    switch (_tag) {
+      case ResultOrErrorTag.errorCode:
+        result += "errorCode";
+        break;
+      case ResultOrErrorTag.results:
+        result += "results";
+        break;
+      default:
+        result += "unknown";
+    }
+    result += ": $_data)";
+    return result;
+  }
+}
+const int kSpeechRecognizerService_listen_name = 0;
+const int kSpeechRecognizerService_stopListening_name = 1;
+
+const String SpeechRecognizerServiceName =
+      'speech_recognizer::SpeechRecognizerService';
+
+abstract class SpeechRecognizerService {
+  dynamic listen([Function responseFactory = null]);
+  void stopListening();
+
+}
+
+
+class SpeechRecognizerServiceProxyImpl extends bindings.Proxy {
+  SpeechRecognizerServiceProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  SpeechRecognizerServiceProxyImpl.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);
+  }
+
+  String get name => SpeechRecognizerServiceName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      case kSpeechRecognizerService_listen_name:
+        var r = SpeechRecognizerServiceListenResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          proxyError("Expected a message with a valid request Id.");
+          return;
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
+        }
+        completerMap.remove(message.header.requestId);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
+        c.complete(r);
+        break;
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "SpeechRecognizerServiceProxyImpl($superString)";
+  }
+}
+
+
+class _SpeechRecognizerServiceProxyCalls implements SpeechRecognizerService {
+  SpeechRecognizerServiceProxyImpl _proxyImpl;
+
+  _SpeechRecognizerServiceProxyCalls(this._proxyImpl);
+    dynamic listen([Function responseFactory = null]) {
+      var params = new SpeechRecognizerServiceListenParams();
+      return _proxyImpl.sendMessageWithRequestId(
+          params,
+          kSpeechRecognizerService_listen_name,
+          -1,
+          bindings.MessageHeader.kMessageExpectsResponse);
+    }
+    void stopListening() {
+      if (!_proxyImpl.isBound) {
+        _proxyImpl.proxyError("The Proxy is closed.");
+        return;
+      }
+      var params = new SpeechRecognizerServiceStopListeningParams();
+      _proxyImpl.sendMessage(params, kSpeechRecognizerService_stopListening_name);
+    }
+  
+}
+
+
+class SpeechRecognizerServiceProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  SpeechRecognizerService ptr;
+  final String name = SpeechRecognizerServiceName;
+
+  SpeechRecognizerServiceProxy(SpeechRecognizerServiceProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _SpeechRecognizerServiceProxyCalls(proxyImpl);
+
+  SpeechRecognizerServiceProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new SpeechRecognizerServiceProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _SpeechRecognizerServiceProxyCalls(impl);
+  }
+
+  SpeechRecognizerServiceProxy.fromHandle(core.MojoHandle handle) :
+      impl = new SpeechRecognizerServiceProxyImpl.fromHandle(handle) {
+    ptr = new _SpeechRecognizerServiceProxyCalls(impl);
+  }
+
+  SpeechRecognizerServiceProxy.unbound() :
+      impl = new SpeechRecognizerServiceProxyImpl.unbound() {
+    ptr = new _SpeechRecognizerServiceProxyCalls(impl);
+  }
+
+  factory SpeechRecognizerServiceProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    SpeechRecognizerServiceProxy p = new SpeechRecognizerServiceProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static SpeechRecognizerServiceProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For SpeechRecognizerServiceProxy"));
+    return new SpeechRecognizerServiceProxy.fromEndpoint(endpoint);
+  }
+
+  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)";
+  }
+}
+
+
+class SpeechRecognizerServiceStub extends bindings.Stub {
+  SpeechRecognizerService _impl = null;
+
+  SpeechRecognizerServiceStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  SpeechRecognizerServiceStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  SpeechRecognizerServiceStub.unbound() : super.unbound();
+
+  static SpeechRecognizerServiceStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For SpeechRecognizerServiceStub"));
+    return new SpeechRecognizerServiceStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = SpeechRecognizerServiceName;
+
+
+  SpeechRecognizerServiceListenResponseParams _SpeechRecognizerServiceListenResponseParamsFactory(ResultOrError resultOrError) {
+    var result = new SpeechRecognizerServiceListenResponseParams();
+    result.resultOrError = resultOrError;
+    return result;
+  }
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      case kSpeechRecognizerService_listen_name:
+        var params = SpeechRecognizerServiceListenParams.deserialize(
+            message.payload);
+        var response = _impl.listen(_SpeechRecognizerServiceListenResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kSpeechRecognizerService_listen_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kSpeechRecognizerService_listen_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
+      case kSpeechRecognizerService_stopListening_name:
+        var params = SpeechRecognizerServiceStopListeningParams.deserialize(
+            message.payload);
+        _impl.stopListening();
+        break;
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  SpeechRecognizerService get impl => _impl;
+  set impl(SpeechRecognizerService d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "SpeechRecognizerServiceStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+
diff --git a/mojo/dart/packages/mojo_services/lib/tracing/tracing.mojom.dart b/mojo/dart/packages/mojo_services/lib/tracing/tracing.mojom.dart
new file mode 100644
index 0000000..40121a9
--- /dev/null
+++ b/mojo/dart/packages/mojo_services/lib/tracing/tracing.mojom.dart
@@ -0,0 +1,903 @@
+// 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.
+
+library tracing_mojom;
+
+import 'dart:async';
+
+import 'package:mojo/bindings.dart' as bindings;
+import 'package:mojo/core.dart' as core;
+
+
+
+class TraceProviderStartTracingParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  String categories = null;
+  Object recorder = null;
+
+  TraceProviderStartTracingParams() : super(kVersions.last.size);
+
+  static TraceProviderStartTracingParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static TraceProviderStartTracingParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    TraceProviderStartTracingParams result = new TraceProviderStartTracingParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.categories = decoder0.decodeString(8, false);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.recorder = decoder0.decodeServiceInterface(16, false, TraceRecorderProxy.newFromEndpoint);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeString(categories, 8, false);
+    
+    encoder0.encodeInterface(recorder, 16, false);
+  }
+
+  String toString() {
+    return "TraceProviderStartTracingParams("
+           "categories: $categories" ", "
+           "recorder: $recorder" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+
+class TraceProviderStopTracingParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(8, 0)
+  ];
+
+  TraceProviderStopTracingParams() : super(kVersions.last.size);
+
+  static TraceProviderStopTracingParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static TraceProviderStopTracingParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    TraceProviderStopTracingParams result = new TraceProviderStopTracingParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    encoder.getStructEncoderAtOffset(kVersions.last);
+  }
+
+  String toString() {
+    return "TraceProviderStopTracingParams("")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    return map;
+  }
+}
+
+
+class TraceRecorderRecordParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  String json = null;
+
+  TraceRecorderRecordParams() : super(kVersions.last.size);
+
+  static TraceRecorderRecordParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static TraceRecorderRecordParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    TraceRecorderRecordParams result = new TraceRecorderRecordParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.json = decoder0.decodeString(8, false);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeString(json, 8, false);
+  }
+
+  String toString() {
+    return "TraceRecorderRecordParams("
+           "json: $json" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["json"] = json;
+    return map;
+  }
+}
+
+
+class TraceCollectorStartParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  core.MojoDataPipeProducer stream = null;
+  String categories = null;
+
+  TraceCollectorStartParams() : super(kVersions.last.size);
+
+  static TraceCollectorStartParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static TraceCollectorStartParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    TraceCollectorStartParams result = new TraceCollectorStartParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.stream = decoder0.decodeProducerHandle(8, false);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.categories = decoder0.decodeString(16, false);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeProducerHandle(stream, 8, false);
+    
+    encoder0.encodeString(categories, 16, false);
+  }
+
+  String toString() {
+    return "TraceCollectorStartParams("
+           "stream: $stream" ", "
+           "categories: $categories" ")";
+  }
+
+  Map toJson() {
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
+  }
+}
+
+
+class TraceCollectorStopAndFlushParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(8, 0)
+  ];
+
+  TraceCollectorStopAndFlushParams() : super(kVersions.last.size);
+
+  static TraceCollectorStopAndFlushParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static TraceCollectorStopAndFlushParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    TraceCollectorStopAndFlushParams result = new TraceCollectorStopAndFlushParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    encoder.getStructEncoderAtOffset(kVersions.last);
+  }
+
+  String toString() {
+    return "TraceCollectorStopAndFlushParams("")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    return map;
+  }
+}
+
+const int kTraceProvider_startTracing_name = 0;
+const int kTraceProvider_stopTracing_name = 1;
+
+const String TraceProviderName =
+      'tracing::TraceProvider';
+
+abstract class TraceProvider {
+  void startTracing(String categories, Object recorder);
+  void stopTracing();
+
+}
+
+
+class TraceProviderProxyImpl extends bindings.Proxy {
+  TraceProviderProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  TraceProviderProxyImpl.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);
+  }
+
+  String get name => TraceProviderName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "TraceProviderProxyImpl($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, kTraceProvider_startTracing_name);
+    }
+  
+    void stopTracing() {
+      if (!_proxyImpl.isBound) {
+        _proxyImpl.proxyError("The Proxy is closed.");
+        return;
+      }
+      var params = new TraceProviderStopTracingParams();
+      _proxyImpl.sendMessage(params, kTraceProvider_stopTracing_name);
+    }
+  
+}
+
+
+class TraceProviderProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  TraceProvider ptr;
+  final String name = TraceProviderName;
+
+  TraceProviderProxy(TraceProviderProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _TraceProviderProxyCalls(proxyImpl);
+
+  TraceProviderProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new TraceProviderProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _TraceProviderProxyCalls(impl);
+  }
+
+  TraceProviderProxy.fromHandle(core.MojoHandle handle) :
+      impl = new TraceProviderProxyImpl.fromHandle(handle) {
+    ptr = new _TraceProviderProxyCalls(impl);
+  }
+
+  TraceProviderProxy.unbound() :
+      impl = new TraceProviderProxyImpl.unbound() {
+    ptr = new _TraceProviderProxyCalls(impl);
+  }
+
+  factory TraceProviderProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    TraceProviderProxy p = new TraceProviderProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static TraceProviderProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For TraceProviderProxy"));
+    return new TraceProviderProxy.fromEndpoint(endpoint);
+  }
+
+  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)";
+  }
+}
+
+
+class TraceProviderStub extends bindings.Stub {
+  TraceProvider _impl = null;
+
+  TraceProviderStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  TraceProviderStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  TraceProviderStub.unbound() : super.unbound();
+
+  static TraceProviderStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For TraceProviderStub"));
+    return new TraceProviderStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = TraceProviderName;
+
+
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      case kTraceProvider_startTracing_name:
+        var params = TraceProviderStartTracingParams.deserialize(
+            message.payload);
+        _impl.startTracing(params.categories, params.recorder);
+        break;
+      case kTraceProvider_stopTracing_name:
+        var params = TraceProviderStopTracingParams.deserialize(
+            message.payload);
+        _impl.stopTracing();
+        break;
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  TraceProvider get impl => _impl;
+  set impl(TraceProvider d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "TraceProviderStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+const int kTraceRecorder_record_name = 0;
+
+const String TraceRecorderName =
+      'tracing::TraceRecorder';
+
+abstract class TraceRecorder {
+  void record(String json);
+
+}
+
+
+class TraceRecorderProxyImpl extends bindings.Proxy {
+  TraceRecorderProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  TraceRecorderProxyImpl.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);
+  }
+
+  String get name => TraceRecorderName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "TraceRecorderProxyImpl($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, kTraceRecorder_record_name);
+    }
+  
+}
+
+
+class TraceRecorderProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  TraceRecorder ptr;
+  final String name = TraceRecorderName;
+
+  TraceRecorderProxy(TraceRecorderProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _TraceRecorderProxyCalls(proxyImpl);
+
+  TraceRecorderProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new TraceRecorderProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _TraceRecorderProxyCalls(impl);
+  }
+
+  TraceRecorderProxy.fromHandle(core.MojoHandle handle) :
+      impl = new TraceRecorderProxyImpl.fromHandle(handle) {
+    ptr = new _TraceRecorderProxyCalls(impl);
+  }
+
+  TraceRecorderProxy.unbound() :
+      impl = new TraceRecorderProxyImpl.unbound() {
+    ptr = new _TraceRecorderProxyCalls(impl);
+  }
+
+  factory TraceRecorderProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    TraceRecorderProxy p = new TraceRecorderProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static TraceRecorderProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For TraceRecorderProxy"));
+    return new TraceRecorderProxy.fromEndpoint(endpoint);
+  }
+
+  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)";
+  }
+}
+
+
+class TraceRecorderStub extends bindings.Stub {
+  TraceRecorder _impl = null;
+
+  TraceRecorderStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  TraceRecorderStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  TraceRecorderStub.unbound() : super.unbound();
+
+  static TraceRecorderStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For TraceRecorderStub"));
+    return new TraceRecorderStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = TraceRecorderName;
+
+
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      case kTraceRecorder_record_name:
+        var params = TraceRecorderRecordParams.deserialize(
+            message.payload);
+        _impl.record(params.json);
+        break;
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  TraceRecorder get impl => _impl;
+  set impl(TraceRecorder d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "TraceRecorderStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+const int kTraceCollector_start_name = 0;
+const int kTraceCollector_stopAndFlush_name = 1;
+
+const String TraceCollectorName =
+      'tracing::TraceCollector';
+
+abstract class TraceCollector {
+  void start(core.MojoDataPipeProducer stream, String categories);
+  void stopAndFlush();
+
+}
+
+
+class TraceCollectorProxyImpl extends bindings.Proxy {
+  TraceCollectorProxyImpl.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
+
+  TraceCollectorProxyImpl.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);
+  }
+
+  String get name => TraceCollectorName;
+
+  void handleResponse(bindings.ServiceMessage message) {
+    switch (message.header.type) {
+      default:
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
+        break;
+    }
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "TraceCollectorProxyImpl($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, kTraceCollector_start_name);
+    }
+  
+    void stopAndFlush() {
+      if (!_proxyImpl.isBound) {
+        _proxyImpl.proxyError("The Proxy is closed.");
+        return;
+      }
+      var params = new TraceCollectorStopAndFlushParams();
+      _proxyImpl.sendMessage(params, kTraceCollector_stopAndFlush_name);
+    }
+  
+}
+
+
+class TraceCollectorProxy implements bindings.ProxyBase {
+  final bindings.Proxy impl;
+  TraceCollector ptr;
+  final String name = TraceCollectorName;
+
+  TraceCollectorProxy(TraceCollectorProxyImpl proxyImpl) :
+      impl = proxyImpl,
+      ptr = new _TraceCollectorProxyCalls(proxyImpl);
+
+  TraceCollectorProxy.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) :
+      impl = new TraceCollectorProxyImpl.fromEndpoint(endpoint) {
+    ptr = new _TraceCollectorProxyCalls(impl);
+  }
+
+  TraceCollectorProxy.fromHandle(core.MojoHandle handle) :
+      impl = new TraceCollectorProxyImpl.fromHandle(handle) {
+    ptr = new _TraceCollectorProxyCalls(impl);
+  }
+
+  TraceCollectorProxy.unbound() :
+      impl = new TraceCollectorProxyImpl.unbound() {
+    ptr = new _TraceCollectorProxyCalls(impl);
+  }
+
+  factory TraceCollectorProxy.connectToService(
+      bindings.ServiceConnector s, String url) {
+    TraceCollectorProxy p = new TraceCollectorProxy.unbound();
+    s.connectToService(url, p);
+    return p;
+  }
+
+  static TraceCollectorProxy newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For TraceCollectorProxy"));
+    return new TraceCollectorProxy.fromEndpoint(endpoint);
+  }
+
+  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)";
+  }
+}
+
+
+class TraceCollectorStub extends bindings.Stub {
+  TraceCollector _impl = null;
+
+  TraceCollectorStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [this._impl])
+      : super.fromEndpoint(endpoint);
+
+  TraceCollectorStub.fromHandle(core.MojoHandle handle, [this._impl])
+      : super.fromHandle(handle);
+
+  TraceCollectorStub.unbound() : super.unbound();
+
+  static TraceCollectorStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For TraceCollectorStub"));
+    return new TraceCollectorStub.fromEndpoint(endpoint);
+  }
+
+  static const String name = TraceCollectorName;
+
+
+
+  dynamic handleMessage(bindings.ServiceMessage message) {
+    if (bindings.ControlMessageHandler.isControlMessage(message)) {
+      return bindings.ControlMessageHandler.handleMessage(this,
+                                                          0,
+                                                          message);
+    }
+    assert(_impl != null);
+    switch (message.header.type) {
+      case kTraceCollector_start_name:
+        var params = TraceCollectorStartParams.deserialize(
+            message.payload);
+        _impl.start(params.stream, params.categories);
+        break;
+      case kTraceCollector_stopAndFlush_name:
+        var params = TraceCollectorStopAndFlushParams.deserialize(
+            message.payload);
+        _impl.stopAndFlush();
+        break;
+      default:
+        throw new bindings.MojoCodecError("Unexpected message name");
+        break;
+    }
+    return null;
+  }
+
+  TraceCollector get impl => _impl;
+  set impl(TraceCollector d) {
+    assert(_impl == null);
+    _impl = d;
+  }
+
+  String toString() {
+    var superString = super.toString();
+    return "TraceCollectorStub($superString)";
+  }
+
+  int get version => 0;
+}
+
+
diff --git a/mojo/dart/packages/mojom/.gitignore b/mojo/dart/packages/mojom/.gitignore
new file mode 100644
index 0000000..f9ced93
--- /dev/null
+++ b/mojo/dart/packages/mojom/.gitignore
@@ -0,0 +1 @@
+packages
diff --git a/mojo/dart/packages/mojom/lib/src/generate.dart b/mojo/dart/packages/mojom/lib/src/generate.dart
index 5657bd9..0b9a1aa 100644
--- a/mojo/dart/packages/mojom/lib/src/generate.dart
+++ b/mojo/dart/packages/mojom/lib/src/generate.dart
@@ -95,7 +95,9 @@
   // Delete .mojom.dart files under [package] that are [olderThanThis].
   _deleteOldMojomDart(Directory package, DateTime olderThanThis) async {
     Directory libDir = new Directory(path.join(package.path, 'lib'));
-    assert(await libDir.exists());
+    if (!await libDir.exists()) {
+      return;
+    }
     await for (var file in libDir.list(recursive: true, followLinks: false)) {
       if (file is! File) continue;
       if (!isMojomDart(file.path)) continue;
@@ -124,6 +126,24 @@
     return result;
   }
 
+  // This is a hack until we can express import paths in .mojom files.
+  // This checks the mojom path for '/mojo/services/' and if found assumes
+  // this mojom needs //mojo/services as an import path when generating
+  // bindings.
+  String _sniffForMojoServicesInclude(String mojomPath) {
+    List<String> pathComponents = path.split(mojomPath);
+    while (pathComponents.length > 2) {
+      int last = pathComponents.length;
+      if ((pathComponents[last - 1] == 'services') &&
+          (pathComponents[last - 2] == 'mojo')) {
+        return path.joinAll(pathComponents);
+      }
+      // Remove the last element and try again.
+      pathComponents.removeLast();
+    }
+    return null;
+  }
+
   _generateForMojom(File mojom, Directory importDir, Directory destination,
       String packageName) async {
     if (!isMojom(mojom.path)) return;
@@ -134,19 +154,25 @@
     final sdkInc = path.normalize(path.join(_mojoSdk.path, '..', '..'));
     final outputDir = await destination.createTemp();
     final output = outputDir.path;
+
+    final servicesPath = _sniffForMojoServicesInclude(mojom.path);
+
     final arguments = [
       '--use_bundled_pylibs',
       '-g',
       'dart',
       '-o',
       output,
-      // TODO(zra): Are other include paths needed?
       '-I',
       sdkInc,
       '-I',
-      importDir.path,
-      mojom.path
+      importDir.path
     ];
+    if (servicesPath != null) {
+      arguments.add('-I');
+      arguments.add(servicesPath);
+    }
+    arguments.add(mojom.path);
 
     log.info('Generating $mojom');
     log.info('$script ${arguments.join(" ")}');
@@ -164,10 +190,10 @@
         log.info("bindings generation result = 0");
       }
 
-      // Generated .mojom.dart is under $output/dart-pkg/$PACKAGE/lib/$X
+      // Generated .mojom.dart is under $output/dart-gen/$PACKAGE/lib/$X
       // Move $X to |destination|/lib/$X.
       // Throw an exception if $PACKGE != [packageName].
-      final generatedDirName = path.join(output, 'dart-pkg');
+      final generatedDirName = path.join(output, 'dart-gen');
       final generatedDir = new Directory(generatedDirName);
       log.info("generatedDir= $generatedDir");
       assert(await generatedDir.exists());
diff --git a/mojo/dart/tools/presubmit/check_mojom_dart.py b/mojo/dart/tools/presubmit/check_mojom_dart.py
new file mode 100755
index 0000000..96ff593
--- /dev/null
+++ b/mojo/dart/tools/presubmit/check_mojom_dart.py
@@ -0,0 +1,355 @@
+#!/usr/bin/env python
+# Copyright 2015 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.
+
+"""Checks that released mojom.dart files in the source tree are up to date"""
+
+import argparse
+import os
+import subprocess
+import sys
+
+SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
+SRC_DIR = os.path.dirname(
+    os.path.dirname(
+        os.path.dirname(
+            os.path.dirname(SCRIPT_DIR))))
+
+# Insert path to mojom parsing library.
+sys.path.insert(0, os.path.join(SRC_DIR,
+                                'mojo',
+                                'public',
+                                'tools',
+                                'bindings',
+                                'pylib'))
+
+from mojom.error import Error
+from mojom.parse.parser import Parse
+from mojom.parse.translate import Translate
+
+PACKAGES_DIR = os.path.join(SRC_DIR, 'mojo', 'dart', 'packages')
+
+# Script that calculates mojom output paths.
+DART_OUTPUTS_SCRIPT = os.path.join(SRC_DIR,
+                                   'mojo',
+                                   'public',
+                                   'tools',
+                                   'bindings',
+                                   'mojom_list_dart_outputs.py')
+
+# Runs command line in args from cwd. Returns the output as a string.
+def run(cwd, args):
+  return subprocess.check_output(args, cwd=cwd)
+
+
+# Given a parsed mojom, return the path of the .mojom.dart relative to its
+# package directory.
+def _mojom_output_path(mojom):
+  name = mojom['name']
+  namespace = mojom['namespace']
+  elements = ['lib']
+  elements.extend(namespace.split('.'))
+  elements.append("%s.dart" % name)
+  return os.path.join(*elements)
+
+
+# Given a parsed mojom, return the package or None.
+def _mojom_package(mojom):
+  attributes = mojom['attributes']
+  return attributes['DartPackage']
+
+
+# Load and parse a .mojom file. Returns the parsed mojom.
+def _load_mojom(path_to_mojom):
+  filename = os.path.abspath(path_to_mojom)
+  name = os.path.basename(filename)
+
+  # Read in mojom file.
+  with open(filename) as f:
+    source = f.read()
+  # Parse
+  tree = Parse(source, name)
+  mojom = Translate(tree, name)
+  return mojom
+
+
+def _print_regenerate_message(package):
+  print("""
+*** Dart Generated Bindings Check Failed for package: %s
+
+To regenerate bindings, from the src directory, run:
+./third_party/dart-sdk/dart-sdk/bin/dart mojo/dart/packages/mojom/bin/mojom.dart gen -m mojo/public -r mojo/ --output mojo/dart/packages/
+""" % (package))
+
+
+# Returns a map from package name to source directory.
+def _build_package_map():
+  packages = {}
+  for package in os.listdir(PACKAGES_DIR):
+    package_path = os.path.join(PACKAGES_DIR, package)
+    # Skip everything but directories.
+    if not os.path.isdir(package_path):
+      continue
+    packages[package] = package_path
+  return packages
+
+
+# Returns a list of paths to .mojom files vended by package_name.
+def _find_mojoms_for_package(package_name):
+  # Run git grep for all .mojom files with DartPackage="package_name"
+  try:
+    output = run(SRC_DIR, ['git',
+                           'grep',
+                           '--name-only',
+                           'DartPackage="' + package_name + '"',
+                           '--',
+                           '*.mojom'])
+  except subprocess.CalledProcessError as e:
+    # git grep exits with code 1 if nothing was found.
+    if e.returncode == 1:
+      return []
+
+  # Process output
+  mojoms = []
+  for line in output.splitlines():
+    line = line.strip()
+    # Skip empty lines.
+    if not line:
+      continue
+    mojoms.append(line)
+  return mojoms
+
+
+# Return the list of expected mojom.dart files for a package.
+def _expected_mojom_darts_for_package(mojoms):
+  output = run(SRC_DIR, ['python',
+                         DART_OUTPUTS_SCRIPT,
+                         '--mojoms'] + mojoms)
+  mojom_darts = []
+  for line in output.splitlines():
+    line = line.strip()
+    # Skip empty lines.
+    if not line:
+      continue
+    mojom_darts.append(line)
+  return mojom_darts
+
+
+# Returns a map indexed by output mojom.dart name with the value of
+# the modification time of the .mojom file in the source tree.
+def _build_expected_map(mojoms, mojom_darts):
+  assert(len(mojom_darts) == len(mojoms))
+  expected = {}
+  for i in range(0, len(mojoms)):
+    mojom_path = os.path.join(SRC_DIR, mojoms[i])
+    expected[mojom_darts[i]] = os.path.getmtime(mojom_path)
+  return expected
+
+
+# Returns a map indexed by output mojom.dart name with the value of
+# the modification time of the .mojom.dart file in the source tree.
+def _build_current_map(package):
+  current = {}
+  package_path = os.path.join(PACKAGES_DIR, package)
+  for directory, _, files in os.walk(package_path):
+    for filename in files:
+      if filename.endswith('.mojom.dart'):
+        path = os.path.abspath(os.path.join(directory, filename))
+        relpath = os.path.relpath(path, start=PACKAGES_DIR)
+        current[relpath] = os.path.getmtime(path)
+  return current
+
+
+# Checks if a mojom.dart file we expected in the source tree isn't there.
+def _check_new(package, expected, current):
+  check_failure = False
+  for mojom_dart in expected:
+    if not current.get(mojom_dart):
+      print("Package %s missing %s" % (package, mojom_dart))
+      check_failure = True
+  return check_failure
+
+
+# Checks if a mojom.dart file exists without an associated .mojom file.
+def _check_delete(package, expected, current):
+  check_failure = False
+  for mojom_dart in current:
+    if not expected.get(mojom_dart):
+      print("Package %s no longer has %s." % (package, mojom_dart))
+      print("Delete %s", os.path.join(PACKAGES_DIR, mojom_dart))
+      check_failure = True
+  return check_failure
+
+
+# Checks if a .mojom.dart file is older than the associated .mojom file.
+# TODO(johnmccutchan): Handle the case where someone edited a .mojom.dart file
+# directly instead of through the bindings generation script.
+def _check_stale(package, expected, current):
+  check_failure = False
+  for mojom_dart in expected:
+    # Missing mojom.dart file in source tree case handled by _check_new.
+    source_mtime = expected[mojom_dart]
+    if not current.get(mojom_dart):
+      continue
+    generated_mtime = current[mojom_dart]
+    if generated_mtime < source_mtime:
+      print("Package %s has old %s" % (package, mojom_dart))
+      check_failure = True
+  return check_failure
+
+
+# Returns True if any checks fail.
+def _check(package, expected, current):
+  check_failure = False
+  if _check_new(package, expected, current):
+    check_failure = True
+  if _check_stale(package, expected, current):
+    check_failure = True
+  if _check_delete(package, expected, current):
+    check_failure = True
+  return check_failure
+
+
+def global_check(packages):
+  check_failure = False
+  for package in packages:
+    mojoms = _find_mojoms_for_package(package)
+    if not mojoms:
+      continue
+    mojom_darts = _expected_mojom_darts_for_package(mojoms)
+    # We only feed in mojom files with DartPackage annotations, therefore, we
+    # should have a 1:1 mapping from mojoms[i] to mojom_darts[i].
+    assert(len(mojom_darts) == len(mojoms))
+    expected = _build_expected_map(mojoms, mojom_darts)
+    current = _build_current_map(package)
+    if _check(package, expected, current):
+      _print_regenerate_message(package)
+      check_failure = True
+  return check_failure
+
+
+def is_mojom_dart(path):
+  return path.endswith('.mojom.dart')
+
+
+def is_mojom(path):
+  return path.endswith('.mojom')
+
+
+def filter_paths(paths, path_filter):
+  result = []
+  for path in paths:
+    path = os.path.abspath(os.path.join(SRC_DIR, path))
+    if path_filter(path):
+      result.append(path)
+  return result
+
+
+def safe_mtime(path):
+  try:
+    return os.path.getmtime(path)
+  except Exception:
+    pass
+  return 0
+
+
+def presubmit_check(packages, affected_files):
+  mojoms = filter_paths(affected_files, is_mojom)
+  mojom_darts = filter_paths(affected_files, is_mojom_dart)
+  updated_mojom_dart_files = []
+  packages_with_failures = []
+  check_failure = False
+
+  # Check for updated .mojom without updated .mojom.dart
+  for mojom_file in mojoms:
+    try:
+      mojom = _load_mojom(mojom_file)
+    except Exception:
+      # Could not load .mojom file
+      return True
+
+    package = _mojom_package(mojom)
+    # If a mojom doesn't have a package, ignore it.
+    if not package:
+      continue
+    package_dir = packages.get(package)
+    # If the package isn't a known package, ignore it.
+    if not package_dir:
+      continue
+    # Expected output path relative to src.
+    mojom_dart_path = os.path.relpath(
+        os.path.join(package_dir, _mojom_output_path(mojom)), start=SRC_DIR)
+
+    mojom_mtime = safe_mtime(mojom_file)
+    mojom_dart_mtime = safe_mtime(os.path.join(SRC_DIR, mojom_dart_path))
+
+    if mojom_mtime > mojom_dart_mtime:
+      check_failure = True
+      print("Package %s has old %s" % (package, mojom_dart_path))
+      if not (package in packages_with_failures):
+        packages_with_failures.append(package)
+      continue
+    # Remember that this .mojom.dart file was updated after the .mojom file.
+    # This list is used to verify that all updated .mojom.dart files were
+    # updated because their source .mojom file changed.
+    updated_mojom_dart_files.append(mojom_dart_path)
+
+  # Check for updated .mojom.dart file without updated .mojom file.
+  for mojom_dart_file in mojom_darts:
+    # mojom_dart_file is not inside //mojo/dart/packages.
+    if not mojom_dart_file.startswith(PACKAGES_DIR):
+      continue
+
+    # Path relative to //mojo/dart/packages/
+    path_relative_to_packages = os.path.relpath(mojom_dart_file,
+                                                start=PACKAGES_DIR)
+    # Package name is first element of split path.
+    package = path_relative_to_packages.split(os.sep)[0]
+    # Path relative to src.
+    mojom_dart_path = os.path.relpath(mojom_dart_file, start=SRC_DIR)
+    # If mojom_dart_path is not in updated_mojom_dart_files, a .mojom.dart
+    # file was updated without updating the related .mojom file.
+    if not (mojom_dart_path in updated_mojom_dart_files):
+      check_failure = True
+      print("Package %s has new %s without updating source .mojom file." %
+            (package, mojom_dart_path))
+      if not (package in packages_with_failures):
+        packages_with_failures.append(package)
+
+  for package in packages_with_failures:
+    _print_regenerate_message(package)
+
+  return check_failure
+
+
+def main():
+  parser = argparse.ArgumentParser(description='Generate a dart-pkg')
+  parser.add_argument('--affected-files',
+                      action='store',
+                      metavar='affected_files',
+                      help='List of files that should be checked.',
+                      nargs='+')
+  args = parser.parse_args()
+  packages = _build_package_map()
+
+  # This script runs in two modes, the first mode is invoked by PRESUBMIT.py
+  # and passes the list of affected files. This checks for the following cases:
+  # 1) An updated .mojom file without an updated .mojom.dart file.
+  # 2) An updated .mojom.dart file without an updated .mojom file.
+  # NOTE: Case 1) also handles the case of a new .mojom file being added.
+  #
+  # The second mode does a global check of all packages under
+  # //mojo/dart/packages. This checks for the following cases:
+  # 1) An updated .mojom file without an updated .mojom.dart file.
+  # 2) A .mojom.dart file without an associated .mojom file (deletion case).
+  if args.affected_files:
+    check_failure = presubmit_check(packages, args.affected_files)
+  else:
+    check_failure = global_check(packages)
+  if check_failure:
+    return 2
+  return 0
+
+if __name__ == '__main__':
+    sys.exit(main())
\ No newline at end of file
diff --git a/mojo/public/tools/bindings/generators/mojom_dart_generator.py b/mojo/public/tools/bindings/generators/mojom_dart_generator.py
index e5f86e1..bf2237a 100644
--- a/mojo/public/tools/bindings/generators/mojom_dart_generator.py
+++ b/mojo/public/tools/bindings/generators/mojom_dart_generator.py
@@ -446,10 +446,22 @@
     elements = self.module.namespace.split('.')
     elements.append("%s.dart" % self.module.name)
 
-    package_name = GetPackage(self.module)
     lib_module = self.GenerateLibModule(args)
-    pkg_path = os.path.join("dart-pkg", package_name, "lib", *elements)
-    self.Write(lib_module, pkg_path)
+
+    # List of packages with checked in bindings.
+    # TODO(johnmccutchan): Stop generating bindings as part of build system
+    # and then remove this.
+    packages_with_checked_in_bindings = [
+      'mojo',
+      'mojo_apptest',
+      'mojo_services',
+      'mojo_sdk'
+      'mojom'
+    ]
+    package_name = GetPackage(self.module)
+    if not (package_name in packages_with_checked_in_bindings):
+      pkg_path = os.path.join("dart-pkg", package_name, "lib", *elements)
+      self.Write(lib_module, pkg_path)
 
     gen_path = os.path.join("dart-gen", package_name, "lib", *elements)
     full_gen_path = os.path.join(self.output_dir, gen_path)
diff --git a/mojo/public/tools/bindings/mojom_list_dart_outputs.py b/mojo/public/tools/bindings/mojom_list_dart_outputs.py
new file mode 100755
index 0000000..3580cf1
--- /dev/null
+++ b/mojo/public/tools/bindings/mojom_list_dart_outputs.py
@@ -0,0 +1,71 @@
+#!/usr/bin/env python
+# 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.
+
+"""Generates the list of dart source file outputs from a mojom.Module."""
+
+import argparse
+import os
+import re
+import shutil
+import sys
+
+SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
+sys.path.insert(0, os.path.join(SCRIPT_DIR, 'pylib'))
+
+from mojom.error import Error
+from mojom.parse.parser import Parse
+from mojom.parse.translate import Translate
+
+def mojom_path(name, namespace, attributes):
+  package_name = attributes['DartPackage']
+  if package_name == None:
+    package_name = 'mojom'
+  elements = [package_name, 'lib']
+  elements.extend(namespace.split('.'))
+  elements.append("%s.dart" % name)
+  return os.path.join(*elements)
+
+
+def process_mojom(path_to_mojom):
+  filename = os.path.abspath(path_to_mojom)
+  name = os.path.basename(filename)
+
+  # Read in mojom file.
+  try:
+    with open(filename) as f:
+      source = f.read()
+  except IOError:
+    print("Error reading %s" % filename)
+    sys.exit(2)
+
+  # Parse
+  try:
+    tree = Parse(source, name)
+  except Error:
+    print("Error parsing %s" % filename)
+    sys.exit(2)
+
+  mojom = Translate(tree, name)
+
+  # Output path
+  print(mojom_path(mojom['name'], mojom['namespace'], mojom['attributes']))
+
+
+def main():
+  parser = argparse.ArgumentParser(description='Output list of ')
+  parser.add_argument('--mojoms',
+                      metavar='mojoms',
+                      nargs='+',
+                      required=True)
+  args = parser.parse_args()
+
+  for mojom in args.mojoms:
+    process_mojom(mojom)
+
+  return 0
+
+
+if __name__ == '__main__':
+    sys.exit(main())
\ No newline at end of file